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

使用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分数了

举个预期结果的例子(假设你的数据有对应记录):

AnswerCSAT_CountCSAT_Score
Average510
Outstanding39
Unsatisfactory22
Total1021

这样就完美实现了你要的——不用额外的子查询/CTE/临时表,纯ROLLUP完成明细+汇总的统计。

内容的提问来源于stack exchange,提问作者Corrie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:29:00