如何按列聚合布尔值统计True和False的数量?
解决方案
问题回顾
现有Output表数据:
| COlA | ColB | ColC |
|---|---|---|
| T | F | T |
| F | T | F |
| F | T | F |
需要按列统计'T'(True)和'F'(False)的数量,目标结果:
| 列名 | True_Sum | False_Sum |
|---|---|---|
| COlA | 1 | 2 |
| ColB | 2 | 1 |
| ColC | 1 | 2 |
原SQL错误点
你的SQL逻辑存在两个核心问题:
- 按
colA, colB, colC分组会将每一行作为独立分组,无法实现按列汇总的需求 CASE WHEN中使用OR条件,统计的是行内任意列满足条件的次数,而非单列的符合次数
正确实现方式
方式1:UNION ALL逐列统计(通用所有SQL数据库)
直接对每列单独统计后合并结果,兼容性最强:
SELECT 'COlA' AS 列名, SUM(CASE WHEN COlA = 'T' THEN 1 ELSE 0 END) AS True_Sum, SUM(CASE WHEN COlA = 'F' THEN 1 ELSE 0 END) AS False_Sum FROM Output UNION ALL SELECT 'ColB' AS 列名, SUM(CASE WHEN ColB = 'T' THEN 1 ELSE 0 END) AS True_Sum, SUM(CASE WHEN ColB = 'F' THEN 1 ELSE 0 END) AS False_Sum FROM Output UNION ALL SELECT 'ColC' AS 列名, SUM(CASE WHEN ColC = 'T' THEN 1 ELSE 0 END) AS True_Sum, SUM(CASE WHEN ColC = 'F' THEN 1 ELSE 0 END) AS False_Sum FROM Output;
方式2:UNPIVOT转置后统计(适用于SQL Server、Oracle等支持UNPIVOT的数据库)
先将列转换为行结构,再分组统计,代码更简洁:
SELECT 列名, SUM(CASE WHEN 值 = 'T' THEN 1 ELSE 0 END) AS True_Sum, SUM(CASE WHEN 值 = 'F' THEN 1 ELSE 0 END) AS False_Sum FROM Output UNPIVOT (值 FOR 列名 IN (COlA, ColB, ColC)) AS unpvt GROUP BY 列名;
内容的提问来源于stack exchange,提问作者Josey1979
相关产品推荐
相关产品推荐

