SQL多列聚合统计:实现各列Y/N/I值的计数及指定格式输出
问题分析
你原来的SQL写法错误在于,GROUP BY field_1, field_2 ... field_20会把20个字段的所有组合当成独立分组,统计的是每个组合下各字段的数量,而不是单独每列中Y/N/I的出现次数,完全偏离了需求。
正确实现方法
根据你想要的示例格式(推测是“每行对应Y/N/I,每列对应字段的计数”),可以用条件聚合+UNION ALL实现;如果需要更灵活的纵向输出格式,也可以用UNION ALL合并单字段统计结果。
方法1:横向输出(匹配预期示例格式)
这种方式生成3行(对应Y/N/I),每行包含20列各取值的计数,和你预期的格式一致:
SELECT 'Y' AS 取值, COUNT(CASE WHEN field_1 = 'Y' THEN 1 END) AS field_1, COUNT(CASE WHEN field_2 = 'Y' THEN 1 END) AS field_2, COUNT(CASE WHEN field_3 = 'Y' THEN 1 END) AS field_3, -- 依次复制上述格式,替换为field_4到field_20 COUNT(CASE WHEN field_20 = 'Y' THEN 1 END) AS field_20 FROM 你的表名 UNION ALL SELECT 'N' AS 取值, COUNT(CASE WHEN field_1 = 'N' THEN 1 END) AS field_1, COUNT(CASE WHEN field_2 = 'N' THEN 1 END) AS field_2, COUNT(CASE WHEN field_3 = 'N' THEN 1 END) AS field_3, -- 依次复制上述格式,替换为field_4到field_20 COUNT(CASE WHEN field_20 = 'N' THEN 1 END) AS field_20 FROM 你的表名 UNION ALL SELECT 'I' AS 取值, COUNT(CASE WHEN field_1 = 'I' THEN 1 END) AS field_1, COUNT(CASE WHEN field_2 = 'I' THEN 1 END) AS field_2, COUNT(CASE WHEN field_3 = 'I' THEN 1 END) AS field_3, -- 依次复制上述格式,替换为field_4到field_20 COUNT(CASE WHEN field_20 = 'I' THEN 1 END) AS field_20 FROM 你的表名;
原理:用CASE WHEN筛选对应字段的目标取值,COUNT统计符合条件的行数;再用UNION ALL把Y、N、I的统计结果拼接成3行。
方法2:纵向输出(灵活适配后续分析)
如果需要后续做数据处理,这种格式更方便,每行记录“字段名、取值、计数”:
SELECT 'field_1' AS 字段名, field_1 AS 取值, COUNT(*) AS 计数 FROM 你的表名 GROUP BY field_1 UNION ALL SELECT 'field_2' AS 字段名, field_2 AS 取值, COUNT(*) AS 计数 FROM 你的表名 GROUP BY field_2 UNION ALL SELECT 'field_3' AS 字段名, field_3 AS 取值, COUNT(*) AS 计数 FROM 你的表名 GROUP BY field_3 -- 依次复制上述格式,替换为field_4到field_20 UNION ALL SELECT 'field_20' AS 字段名, field_20 AS 取值, COUNT(*) AS 计数 FROM 你的表名 GROUP BY field_20;
原理:单独统计每个字段的取值分布,再用UNION ALL合并所有字段的结果。
内容的提问来源于stack exchange,提问作者hamesjendo
相关产品推荐
相关产品推荐

