如何合并UNION查询以按CategoryID获取填充率与行数统计
最优合并分组统计与整体总计的SQL方案
可以使用GROUP BY WITH ROLLUP语法替代原有的UNION查询,该方式仅需扫描一次临时表,性能更优,同时能生成与原查询完全一致的结果(分组统计+整体总计)。
实现代码
SELECT CASE WHEN GROUPING(CategoryID) = 1 THEN '整体总计' ELSE CAST(CategoryID AS VARCHAR(50)) END AS CategoryID, COUNT(*) AS Table_RowCount, COUNT(ArbitraryColumnName) AS Field_NonNullCount, COUNT(DISTINCT ArbitraryColumnName) AS Field_DistinctCount, ROUND((COUNT(ArbitraryColumnName) * 100.0 / COUNT(*)), 2) AS Field_FillRate FROM #TempTable GROUP BY CategoryID WITH ROLLUP;
关键说明
GROUPING(CategoryID) = 1用于识别ROLLUP生成的整体总计行,这里将其显示为"整体总计",若需用NULL标识可直接移除CASE逻辑。- 所有统计指标的计算逻辑与原UNION的两个查询完全对齐:
COUNT(*)统计分组/整体的总行数COUNT(ArbitraryColumnName)统计非NULL值的数量(COUNT会自动忽略NULL)COUNT(DISTINCT ArbitraryColumnName)统计字段的去重值数量Field_FillRate按非NULL行数占总行数的百分比计算,保留两位小数
- 相比原UNION方案,此方法仅需扫描一次临时表,在数据量较大时性能优势显著。
内容的提问来源于stack exchange,提问作者EthanT
相关产品推荐
相关产品推荐

