使用Rollup实现汇总统计,寻求无需子查询/CTE/临时表的方案
用ROLLUP实现无额外子查询/CTE的汇总统计
嘿,你选的方向完全没问题!GROUP BY ... WITH ROLLUP本身就是用来做这类层级汇总的,完全不需要子查询、CTE或者临时表。不过你的当前代码有个小问题:汇总行(也就是显示'Total'的那一行)的CSAT_Score会是NULL,因为你的CASE语句只处理了具体的Answer值,没覆盖汇总的场景。
这里给你修正后的代码,直接就能得到完整的统计结果:
SELECT COALESCE(Answer, CASE GROUPING_ID(Answer) WHEN 1 THEN 'Total' END) AS Answer, COUNT(*) AS CSAT_Count, -- 针对具体Answer计算分数,汇总行则计算所有分数的总和 CASE WHEN GROUPING_ID(Answer) = 1 THEN SUM( CASE Answer WHEN 'Average' THEN 2 WHEN 'Outstanding' THEN 3 WHEN 'Unsatisfactory' THEN 1 ELSE 0 END ) ELSE CASE Answer WHEN 'Average' THEN 2 * COUNT(*) WHEN 'Outstanding' THEN 3 * COUNT(*) WHEN 'Unsatisfactory' THEN 1 * COUNT(*) ELSE 0 END END AS CSAT_Score FROM CSAT_Table WHERE Empl_ID = 98 GROUP BY Answer WITH ROLLUP;
关键修正点:
- 用
GROUPING_ID(Answer)判断当前行是明细行还是汇总行:当值为1时,就是ROLLUP生成的汇总行 - 汇总行里用
SUM()嵌套CASE来计算所有明细行的分数总和,这样就能得到总CSAT分数了
举个预期结果的例子(假设你的数据有对应记录):
| Answer | CSAT_Count | CSAT_Score |
|---|---|---|
| Average | 5 | 10 |
| Outstanding | 3 | 9 |
| Unsatisfactory | 2 | 2 |
| Total | 10 | 21 |
这样就完美实现了你要的——不用额外的子查询/CTE/临时表,纯ROLLUP完成明细+汇总的统计。
内容的提问来源于stack exchange,提问作者Corrie
相关产品推荐
相关产品推荐

