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

标签 sql sql-server tsql

我需要帮助根据某些列的值在 SQL Server 中得出结论,例如状态聚合之类的。 例如,下表是一个包含服务器任务及其状态的表格。

如果我想返回每个服务器的聚合状态,规则如下:

  • 如果所有服务器任务都处于“SUBMITTED”状态,则聚合服务器状态为“AWAITING”
  • 如果所有任务都处于“已完成”状态 - 聚合状态为“完成”
  • 如果不满足上述情况,则聚合服务器状态为“进行中”

示例表:任务

<表类="s-表"> <头> 服务器 任务状态 任务 <正文> 服务器 1 正在运行 1-1 服务器 1 完成 1-2 服务器 1 已提交 1-3 服务器 2 完成 2-1 服务器 2 完成 2-2 服务器 3 已提交 3-1 服务器 3 已提交 3-2

示例查询结果:

<表类="s-表"> <头> 服务器 完成 <正文> 服务器 1 进行中 服务器 2 完成 服务器 3 等待

最佳答案

你可以使用这个:

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

enter image description here

关于SQL:根据某些条件返回聚合结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68281247/

相关文章:

sql - 选择作为 DML 命令

java - 编写外键关联查询

sql-server - SQL Server 中的快照隔离

sql - "No column information was returned"从空 Excel 工作表中选择时出错

sql - 计算当前财政年度第一天的最有效方法?

sql-server - 如何使用 T-SQL 从过程中返回空结果集?

mysql - SQL INNER JOIN ON LIKE

sql - 在Postgres中, ".USSTZ"T"HH24 :MI:SS. USSTZ'中末尾的 'YYYY-MM-DD"是什么意思?

sql-server - SQL Server 中 CONTEXT_INFO 的范围是什么?

sql - 使用 SQL 查询替换 JSON 中的数据