You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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升序

关键调整说明

  1. 区分原始NULL与汇总行:
    用GROUPING(t1.A)函数精准识别WITH ROLLUP生成的汇总行(返回1)和原始数据中的NULL性别(返回0),这样就能分别显示'TOTAL'和'BLANK',不会混淆两类NULL。

  2. 修正统计基准:
    将百分比计算的基准改为所有记录的总数SUM(t1.TOTAL) OVER ()(也就是7),这样每个分组的百分比都是基于总记录数的占比,比如3/7≈42.86%,完全符合你的期望数值。

  3. 调整排序与CODE显示:

    • 强制让汇总行(TOTAL)排在最前面,CODE显示为0
    • 把原始NULL性别的记录CODE设为4,放在所有有效分组之后
    • 其余记录按CODE升序排列,和你期望的输出顺序完全一致
  4. 累积值逻辑修正:
    累积计算时排除汇总行的数值,只统计实际分组的累积和,确保最终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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 15:17:46