使用GROUPING SETS((a),(b),(c),(d))为何生成4条全NULL记录?
解析GROUPING SETS生成4条全NULL记录的逻辑
当你使用GROUPING SETS((a), (b), (c), (d))时,本质是将四个独立分组的结果做UNION ALL,每个分组的特性直接导致了全NULL记录的产生:
- 按
a分组时,b、c、d列会被置为NULL;如果a字段本身包含NULL值,就会生成一行a为NULL、其余列也为NULL的记录,对应a字段NULL值分组的聚合结果 - 按
b分组时,a、c、d列会被置为NULL;若b字段存在NULL值,同样会生成一行全NULL的记录 - 按
c、d分组的逻辑完全一致,只要对应字段存在NULL值,就会各自生成一条全NULL的分组结果
这就是你看到4条全NULL记录的核心原因——每个单字段分组中,该字段的NULL值被单独作为一个分组项,而其他字段在该分组维度下本身就是NULL,最终呈现为全NULL的行。
如果要过滤掉这些全NULL记录,可以直接筛选维度字段不全为NULL的行,或者用GROUPING()函数精准区分分组导致的NULL和字段本身的NULL:
-- 直接过滤全NULL维度行 SELECT a, b, c, d, SUM(metric) AS total FROM your_table GROUP BY GROUPING SETS((a), (b), (c), (d)) WHERE NOT (a IS NULL AND b IS NULL AND c IS NULL AND d IS NULL); -- 用GROUPING函数精准判断分组有效性 SELECT a, b, c, d, SUM(metric) AS total FROM your_table GROUP BY GROUPING SETS((a), (b), (c), (d)) WHERE GROUPING(a) = 0 OR GROUPING(b) = 0 OR GROUPING(c) = 0 OR GROUPING(d) = 0;
GROUPING(col)返回1表示该列未参与当前分组,返回0表示该列是分组键,上面的条件确保至少有一个字段是有效分组键。
内容的提问来源于stack exchange,提问作者Jhansi
相关产品推荐
相关产品推荐

