SQL:根据某些条件返回聚合结果

3AK*_*BAH 2 sql t-sql sql-server

我需要帮助根据某些列的值(例如状态聚合)在 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

示例查询结果:

服务器 完成
服务器 1 进行中
服务器 2 完毕
服务器 3 等待

到目前为止,我尝试使用以下查询但没有成功:

SELECT Server,
    CASE 
       WHEN Task_Status NOT IN ('RUNNING', 'COMPLETED') THEN 'AWAITING' -- Status SUBMITED
       WHEN Task_Status NOT IN ('RUNNING', 'SUBMITED') THEN 'DONE' -- Status COMPLETED
       ELSE 'IN PROGRESS'
    END Completion
FROM Tasks
Run Code Online (Sandbox Code Playgroud)

Pha*_*ach 5

你可以用这个:

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;
Run Code Online (Sandbox Code Playgroud)

sqlfiddle 中测试

在此处输入图片说明