使用CTE计算各季度不同类型客户反馈占比的SQL技术咨询
解决方案
先修正你的CTE逻辑,要实现需求需要分两步:用CTE计算每个季度的总反馈数,再在主查询中统计各季度内不同反馈类型的数量,关联CTE数据计算占比。
正确代码示例
WITH quarterly_total AS ( SELECT `quarter number` AS quarter, COUNT(customer_feedback) AS total_feedback FROM order_t GROUP BY `quarter number` ) SELECT q.quarter, o.customer_feedback AS feedback_type, COUNT(o.customer_feedback) AS type_count, q.total_feedback, ROUND(COUNT(o.customer_feedback) / q.total_feedback * 100, 2) AS percentage FROM order_t o JOIN quarterly_total q ON o.`quarter number` = q.quarter WHERE o.customer_feedback IN ('good', 'bad', 'ok', 'very good', 'very bad') GROUP BY q.quarter, o.customer_feedback, q.total_feedback ORDER BY q.quarter, percentage DESC;
代码说明
- CTE部分:
quarterly_total负责计算每个季度的总反馈数,按quarter number分组。注意带空格的列名需要用反引号包裹(不同数据库可能需用双引号,比如PostgreSQL)。 - 主查询部分:
- 关联
order_t和CTE,按季度、反馈类型分组,统计每个类型的反馈数量 - 用
WHERE子句过滤指定的反馈类型,避免无关数据干扰 - 计算占比时乘以100并保留两位小数,结果更直观
- 按季度、占比降序排序,便于查看各季度的反馈分布
- 关联
原代码问题分析
- 语法错误:
SELECT * COUNT(CUSTOMER_FEEDBACK), QUARTER NUMBER缺少逗号分隔符,且无需*,应只选择必要列 - 表名错误:误写为
table1,实际目标表是order_t - 分组逻辑缺失:未按
customer_feedback分组,无法统计各类型的反馈数量 - 列名处理:带空格的列名未做包裹处理,会导致数据库识别报错
内容的提问来源于stack exchange,提问作者Drishan Vig
相关产品推荐
相关产品推荐

