Oracle SQL:将按T.ID分组的状态统计结果合并为单行输出
解决方案
你需要分两步处理:先统计每个ID下各状态的数量,再把同一ID的统计结果合并成单行。
修正后的SQL代码
SELECT ID, LISTAGG(STATUS_COUNT, ', ') WITHIN GROUP (ORDER BY STATUS) AS RESULTS FROM ( -- 先按ID和状态分组,统计每个状态的数量,生成类似"C:2"的字符串 SELECT T.ID, T.STATUS || ':' || COUNT(T.STATUS) AS STATUS_COUNT FROM TRANSACTION T GROUP BY T.ID, T.STATUS ) -- 再按ID分组,用LISTAGG合并所有状态统计字符串 GROUP BY ID ORDER BY ID;
说明
- 子查询先完成按ID+状态的分组统计,得到每个ID下各状态的计数字符串(比如"S:3");
- 外层查询只按ID分组,用
LISTAGG函数把同一个ID的所有状态统计字符串用,连接起来,得到单行结果; WITHIN GROUP (ORDER BY STATUS)可以保证合并后的字符串按状态排序,不需要排序的话可以去掉这部分。
执行后会得到和示例一致的输出:
| ID | RESULTS |
|---|---|
| 1000 | C:1 |
| 1231 | C:2, E:1, S:3 |
内容的提问来源于stack exchange,提问作者Sean Whiting
相关产品推荐
相关产品推荐

