我有下表,我应该计算每个列名的条目(5,4,3,2,1)

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

我try 按列名和范围(5,4,3,2,1)手动计数(从Responsiveness1=‘5’的表中 Select Count(Responsiveness1)),并得到输出.但不幸的是,我必须按列和按范围计算它,然后将其显示在我的表中.

有没有一种更简单、更有效的方法来实现以下输出:

Rate Responsiveness1 Responsiveness2 Reliability1
5 2 1 1
4 1 1 1
3 0 1 1
2 1 1 2
1 2 2 1

而不必按列名计数,然后将其插入到输出表中?

推荐答案

是的,您可以使用MySQL SUM函数来统计每一列的每个评级出现的次数,然后使用CASE语句将每个评级映射到相应的列.

以下是一个示例查询:

SELECT 
  rating.Rate, 
  SUM(CASE WHEN t.Responsiveness1 = rating.Rate THEN 1 ELSE 0 END) AS Responsiveness1, 
  SUM(CASE WHEN t.Responsiveness2 = rating.Rate THEN 1 ELSE 0 END) AS Responsiveness2, 
  SUM(CASE WHEN t.Reliability1 = rating.Rate THEN 1 ELSE 0 END) AS Reliability1 
FROM 
  my_table t 
  CROSS JOIN (SELECT 5 AS Rate UNION ALL SELECT 4 UNION ALL SELECT 3 UNION ALL SELECT 2 UNION ALL SELECT 1) rating 
GROUP BY 
  rating.Rate 
ORDER BY 
  rating.Rate DESC;

SQL小提琴Output

Mysql相关问答推荐

MySQL InnoDB:可以在没有回滚损失的情况下从运行的查询中进行大型插入吗

如何在产品查询中插入GROUP_CONCAT?

如何跨多个产品查找相同时间范围的数据集

如何用sql找出两次之间的差异

如何分解分组依据的数据?

关于设置为 NOT NULL 时的 CHAR 默认值

MySQL CHECK 约束以确保记录不使用自动增量 ID 引用自身?

Select 最高等级最多的部门名称

如何编写一个查询,计算表中每个日期的一个日期加上前 4 天的记录数?

仅计算 DATEDIFF (MySQL) 中的工作日

分别针对每个不同的列 Select 聚合

为什么 MySQL 不使用索引进行简单的SELECT * FROM Table WHERE field='value'查询?

MySQL Join 查询位置从订单

创建将列与多个值进行比较的索引

MySQL如何在小时和分钟之间 Select 时间

查询以从约会表中获取可用空档

如何在任何连续范围内获得最大值

如何通过一个查询批量更新 mysql 数据?

如何在特定数据库中创建表?

MySQL 实用程序 - ~/.my.cnf 选项文件