如何高效按列统计评分(5-1)并生成指定格式统计表格?
高效统计多列评分分布的SQL方法
我需要按评分5、4、3、2、1分别统计Responsiveness1、Responsiveness2、Reliability1三列的条目数,生成指定格式的统计表格。目前我通过Select Count(Responsiveness1) from table where Responsiveness1 = '5'这类语句手动逐个统计,想知道有没有更高效的实现方式。
原始数据表格
| ID | ClientID | Responsiveness1 | Responsiveness2 | Reliability1 |
|---|---|---|---|---|
| 1024 | 3511 | 5 | 4 | 3 |
| 1025 | 4571 | 5 | 3 | 5 |
| 1026 | 3827 | 4 | 5 | 4 |
| 1027 | 7652 | 1 | 1 | 1 |
| 1028 | 7778 | 2 | 2 | 2 |
| 1029 | 7612 | 1 | 1 | 2 |
期望输出表格
| Rate | Responsiveness1 | Responsiveness2 | Reliability1 |
|---|---|---|---|
| 5 | 2 | 1 | 1 |
| 4 | 1 | 1 | 1 |
| 3 | 0 | 1 | 1 |
| 2 | 1 | 1 | 2 |
| 1 | 2 | 2 | 1 |
高效实现方案
可以使用条件聚合的方式,仅需一次查询就能完成所有统计,无需重复执行单值统计语句。
适用于支持CTE(公共表表达式)的数据库(如MySQL 8.0+、PostgreSQL、SQL Server等)
WITH rating_values AS ( SELECT 5 AS rate UNION ALL SELECT 4 UNION ALL SELECT 3 UNION ALL SELECT 2 UNION ALL SELECT 1 ) SELECT rv.rate, COUNT(CASE WHEN t.Responsiveness1 = rv.rate THEN 1 END) AS Responsiveness1, COUNT(CASE WHEN t.Responsiveness2 = rv.rate THEN 1 END) AS Responsiveness2, COUNT(CASE WHEN t.Reliability1 = rv.rate THEN 1 END) AS Reliability1 FROM rating_values rv LEFT JOIN your_table t ON 1=1 GROUP BY rv.rate ORDER BY rv.rate DESC;
适用于不支持CTE的老版本数据库
SELECT rv.rate, COUNT(CASE WHEN t.Responsiveness1 = rv.rate THEN 1 END) AS Responsiveness1, COUNT(CASE WHEN t.Responsiveness2 = rv.rate THEN 1 END) AS Responsiveness2, COUNT(CASE WHEN t.Reliability1 = rv.rate THEN 1 END) AS Reliability1 FROM ( SELECT 5 AS rate UNION ALL SELECT 4 UNION ALL SELECT 3 UNION ALL SELECT 2 UNION ALL SELECT 1 ) rv LEFT JOIN your_table t ON 1=1 GROUP BY rv.rate ORDER BY rv.rate DESC;
代码说明
- 先构造包含所有目标评分(5到1)的数据集,确保即使某个评分在原始表中没有对应数据,结果里也会显示0值。
- 通过
LEFT JOIN关联原始表,保证每个评分都能出现在最终结果中。 - 使用
COUNT(CASE ...)进行条件统计:当列值匹配当前评分时返回1,否则返回NULL,COUNT函数会自动忽略NULL值,从而得到对应评分的条目数。 - 最后按评分降序排列,与期望输出格式一致。
内容的提问来源于stack exchange,提问作者MCKMB
相关产品推荐
相关产品推荐

