如何将多组子查询单统计SQL合并为单查询多列统计?
解决方法:用条件聚合合并多查询为单行多列结果
嘿,这个需求太常见了!你可以用条件聚合的方式,把多个仅SOURCE_ID不同的统计查询合并成一个,直接输出每行对应一个统计值的结果。
最终SQL示例
假设你需要统计SOURCE_ID为1、2、3的情况,代码如下:
SELECT COUNT(CASE WHEN s1.SOURCE_ID = 1 THEN 1 END) AS source_1_count, COUNT(CASE WHEN s1.SOURCE_ID = 2 THEN 1 END) AS source_2_count, COUNT(CASE WHEN s1.SOURCE_ID = 3 THEN 1 END) AS source_3_count -- 继续添加更多CASE WHEN行,覆盖你需要的所有SOURCE_ID取值 FROM ( SELECT * FROM TABLE1 t JOIN TABLE2 e USING (EVENT_ID) ) s1;
逻辑解释
- 核心是
COUNT(CASE WHEN ... THEN 1 END):当s1.SOURCE_ID匹配目标值时返回1,否则返回NULL;而COUNT函数会自动忽略NULL,刚好统计出对应ID的有效记录数。 - 如果你习惯用
SUM,也可以写成SUM(CASE WHEN s1.SOURCE_ID = 1 THEN 1 ELSE 0 END),效果完全一致。 - 如果子查询里存在重复记录,需要统计唯一值的话,改成
COUNT(DISTINCT CASE WHEN ... THEN s1.EVENT_ID END)即可(替换EVENT_ID为你需要去重的字段)。
扩展提示
如果你的SOURCE_ID取值非常多,手动写CASE WHEN太麻烦,可以考虑动态生成SQL(比如用存储过程或者脚本拼接),但如果是固定的几个值,上面的静态写法最简单高效。
内容的提问来源于stack exchange,提问作者AJwr
相关产品推荐
相关产品推荐

