如何不使用GROUP BY实现COUNT()与聚合计算以生成NPS分数
无需临时表/子查询的NPS统计方案
直接用条件聚合就能搞定,不需要折腾临时表或者容易出错的PIVOT,而且只需要一次分组,能有效降低Tableau的数据源处理负载:
SELECT service, office, -- 统计贬损者数量(0-6分) SUM(CASE WHEN score BETWEEN 0 AND 6 THEN 1 ELSE 0 END) AS detractors, -- 统计被动者数量(7-8分) SUM(CASE WHEN score BETWEEN 7 AND 8 THEN 1 ELSE 0 END) AS passives, -- 统计推荐者数量(9-10分) SUM(CASE WHEN score BETWEEN 9 AND 10 THEN 1 ELSE 0 END) AS promoters, -- 总回答数 COUNT(*) AS total_responses, -- 计算NPS分数,*1.0避免整数除法,ROUND控制精度 ROUND( (SUM(CASE WHEN score BETWEEN 9 AND 10 THEN 1 ELSE 0 END) * 1.0 / COUNT(*)) - (SUM(CASE WHEN score BETWEEN 0 AND 6 THEN 1 ELSE 0 END) * 1.0 / COUNT(*)), 4 ) AS NPS_score FROM customer_survey GROUP BY service, office;
方案优势:
- 无需临时表或嵌套子查询,一次查询直接输出所有统计字段,减少数据库与Tableau的中间计算环节
- 比PIVOT更通用——不同数据库的PIVOT语法差异极大,条件聚合在MySQL、PostgreSQL、SQL Server等主流环境下都能直接运行
- 逻辑直观,后续调整分数区间或统计规则时,修改对应CASE语句即可,维护成本低
内容的提问来源于stack exchange,提问作者Mats
相关产品推荐
相关产品推荐

