如何正确查询按UniqueId分组的多状态计数数据?
解决行转列(Pivot)需求的SQL方案
这其实是SQL里非常经典的**行转列(Pivot)**场景,刚好你的数据结构很适合用条件聚合来实现,完全不用修改现有表结构就能得到你想要的结果!
核心思路
因为你的status只有固定的三个取值(completed、failed、Attention),我们可以用CASE WHEN语句配合聚合函数,把同一UniqueId下不同状态的Count值映射到单独的列中。
通用SQL写法(兼容绝大多数数据库)
这种方法用条件聚合实现,不管你用MySQL、PostgreSQL、SQL Server还是Oracle都能跑:
SELECT UniqueId, -- 提取completed状态的Count值,没有则返回0 SUM(CASE WHEN Status = 'completed' THEN Count ELSE 0 END) AS count_completed, -- 提取failed状态的Count值 SUM(CASE WHEN Status = 'failed' THEN Count ELSE 0 END) AS count_failed, -- 提取Attention状态的Count值 SUM(CASE WHEN Status = 'Attention' THEN Count ELSE 0 END) AS count_Attention FROM your_table_name -- 替换成你的实际表名 GROUP BY UniqueId ORDER BY UniqueId;
为什么用SUM?因为每个UniqueId+Status的组合只有一条记录,用SUM或者MAX、MIN结果都是一样的,SUM是最通用的选择。
部分数据库的原生Pivot写法(可选)
如果你的数据库支持原生PIVOT语法(比如SQL Server、Oracle),也可以用更简洁的写法:
SELECT UniqueId, completed AS count_completed, failed AS count_failed, Attention AS count_Attention FROM your_table_name -- 替换成你的实际表名 PIVOT ( SUM(Count) FOR Status IN (completed, failed, Attention) ) AS PivotResult ORDER BY UniqueId;
不过这种写法兼容性稍差,如果你不确定数据库支持情况,优先用上面的条件聚合写法更稳妥。
验证结果
用你提供的示例数据测试,两种写法都会返回你期望的格式:
| UniqueId | count_completed | count_failed | count_Attention |
|---|---|---|---|
| 679FCE83-B245-E511-A42C-90B11C2CD708 | 64 | 101 | 1 |
| 4500990D-F516-E411-BB09-90B11C2CD708 | 100 | 516 | 17 |
| 557857BD-6B46-E511-A42C-90B11C2CD708 | 67 | 103 | 4 |
内容的提问来源于stack exchange,提问作者Zakkkkkkkkkkkk
相关产品推荐
相关产品推荐

