DB2/LUW:如何获取分组小计与总计且总计标签不为NULL?
替换GROUPING SETS/ROLLUP总计行的NULL标签
你可以利用GROUPING()函数配合条件判断来实现,只需要一次表扫描就能完成,无需重复查询数据:
SELECT CASE WHEN GROUPING(GROUP_KEY_TYPE) = 1 THEN '{TOTAL}' ELSE GROUP_KEY_TYPE END AS GROUP_KEY_TYPE, COUNT(*) AS group_count FROM LIBRAT.GL_GROUPS GROUP BY GROUPING SETS((GROUP_KEY_TYPE), ()) ORDER BY GROUPING(GROUP_KEY_TYPE), GROUP_KEY_TYPE;
关键说明:
GROUPING(GROUP_KEY_TYPE)是专门识别ROLLUP/GROUPING SETS聚合行的函数:当该行是总计行(由()分组集生成)时返回1,普通分组行返回0。用它判断能精准区分总计行的NULL和分组字段本身的NULL值,避免误替换。- 排序时加入
GROUPING(GROUP_KEY_TYPE),可以让总计行固定排在结果集最后(1的排序优先级高于0),解决原查询中NULL排在最前面的问题。 - 整个查询只扫描一次
LIBRAT.GL_GROUPS表,相比UNION ALL的两次扫描,在数据量较大时能显著提升性能。
如果你的分组字段GROUP_KEY_TYPE本身不会出现NULL值,也可以简化用COALESCE:
SELECT COALESCE(GROUP_KEY_TYPE, '{TOTAL}') AS GROUP_KEY_TYPE, COUNT(*) AS group_count FROM LIBRAT.GL_GROUPS GROUP BY GROUPING SETS((GROUP_KEY_TYPE), ()) ORDER BY CASE WHEN GROUP_KEY_TYPE IS NULL THEN 1 ELSE 0 END, GROUP_KEY_TYPE;
但优先推荐GROUPING()的写法,逻辑更严谨,适配所有场景。
内容的提问来源于stack exchange,提问作者Dave Clark
相关产品推荐
相关产品推荐

