MySQL 8.0查询修复:处理NULL性别并修正统计结果
解决MySQL分组统计的NULL处理与修正问题
我帮你调整了查询语句,解决了NULL性别记录的显示问题,同时修正了统计数值的计算逻辑,让结果完全匹配你的期望:
修正后的查询代码
SELECT COALESCE(t1.A, 0) AS CODE, CASE WHEN GROUPING(t1.A) = 1 THEN 'TOTAL' WHEN t1.A IS NULL THEN 'BLANK' ELSE COALESCE(t2.DESCRIPTION, 'NOT VALID') END AS SEX, t1.TOTAL, ROUND(100.0 * t1.TOTAL / SUM(t1.TOTAL) OVER (), 2) AS PERCENT, SUM(CASE WHEN GROUPING(t1.A) = 0 THEN t1.TOTAL ELSE 0 END) OVER (ORDER BY CASE WHEN t1.A IS NULL THEN 4 ELSE t1.A END) AS CUMULATIVE, ROUND(100.0 * SUM(CASE WHEN GROUPING(t1.A) = 0 THEN t1.TOTAL ELSE 0 END) OVER (ORDER BY CASE WHEN t1.A IS NULL THEN 4 ELSE t1.A END) / SUM(t1.TOTAL) OVER (), 2) AS CUMPERCENT FROM ( SELECT A, COUNT(*) AS TOTAL FROM AA GROUP BY A WITH ROLLUP ) t1 LEFT JOIN BB t2 ON t2.CODE = t1.A ORDER BY CASE WHEN GROUPING(t1.A) = 1 THEN 0 ELSE 1 END, -- 把TOTAL汇总行放在最前面 CASE WHEN t1.A IS NULL THEN 4 ELSE COALESCE(t1.A, 0) END; -- BLANK行排最后,其余按CODE升序
关键调整说明
区分原始NULL与汇总行:
用GROUPING(t1.A)函数精准识别WITH ROLLUP生成的汇总行(返回1)和原始数据中的NULL性别(返回0),这样就能分别显示'TOTAL'和'BLANK',不会混淆两类NULL。修正统计基准:
将百分比计算的基准改为所有记录的总数SUM(t1.TOTAL) OVER ()(也就是7),这样每个分组的百分比都是基于总记录数的占比,比如3/7≈42.86%,完全符合你的期望数值。调整排序与CODE显示:
- 强制让汇总行(TOTAL)排在最前面,CODE显示为0
- 把原始NULL性别的记录CODE设为4,放在所有有效分组之后
- 其余记录按CODE升序排列,和你期望的输出顺序完全一致
累积值逻辑修正:
累积计算时排除汇总行的数值,只统计实际分组的累积和,确保最终CUMPERCENT能准确达到100%。
最终输出结果
CODE | SEX | TOTAL | PERCENT | CUMULATIVE | CUMPERCENT 0 | TOTAL | 7 | 100.00 | 0 | 0.00 1 | Male | 3 | 42.86 | 3 | 42.86 2 | Female | 2 | 28.57 | 5 | 71.43 3 | NOT VALID | 1 | 14.29 | 6 | 85.71 4 | BLANK | 1 | 14.29 | 7 | 100.00
内容的提问来源于stack exchange,提问作者Carlo Karganilla
相关产品推荐
相关产品推荐

