SQL:根据某些条件返回聚合结果
我需要帮助根据某些列的值(例如状态聚合)在 SQL Server 中得出结论。例如,下面是一个包含服务器任务及其状态的表格。
如果我想返回每个服务器的聚合状态,这里是规则:
- 如果所有服务器任务都处于“提交”状态,则聚合服务器状态为“等待”
- 如果所有任务都处于“完成”状态 - 聚合状态为“完成”
- 如果不满足上述情况,则聚合服务器状态为“IN PROGRESS”
示例表:任务
| 服务器 | 任务状态 | 任务 |
|---|---|---|
| 服务器 1 | 跑步 | 1-1 |
| 服务器 1 | 完全的 | 1-2 |
| 服务器 1 | 已提交 | 1-3 |
| 服务器 2 | 完全的 | 2-1 |
| 服务器 2 | 完全的 | 2-2 |
| 服务器 3 | 已提交 | 3-1 |
| 服务器 3 | 已提交 | 3-2 |
回答
你可以用这个:
WITH table_name AS
(
SELECT 'Server 1' AS server, 'RUNNING' AS task_status, '1-1' AS task UNION ALL
SELECT 'Server 1' AS server, 'COMPLETED' AS task_status, '1-2' AS task UNION ALL
SELECT 'Server 1' AS server, 'SUBMITTED' AS task_status, '1-3' AS task UNION ALL
SELECT 'Server 2' AS server, 'COMPLETED' AS task_status, '2-1' AS task UNION ALL
SELECT 'Server 2' AS server, 'COMPLETED' AS task_status, '2-2' AS task UNION ALL
SELECT 'Server 3' AS server, 'SUBMITTED' AS task_status, '3-1' AS task UNION ALL
SELECT 'Server 3' AS server, 'SUBMITTED' AS task_status, '3-2' AS task
)
SELECT server,
CASE
WHEN COUNT(DISTINCT task_status) = 1 AND MAX(task_status) = 'SUBMITTED' THEN 'AWAITING'
WHEN COUNT(DISTINCT task_status) = 1 AND MAX(task_status) = 'COMPLETED' THEN 'DONE'
ELSE 'IN PROGRESS'
END AS completion
FROM table_name
GROUP BY server
ORDER BY server;
在sqlfiddle 中测试