mysql - 使用 SQL 的 GROUP BY 子句时计算单个组中多个不同值的计数

标签 mysql sql select count group-by

考虑我的表中有以下数据。

表名:任务

+---------+
| status  |
+---------+
| open    |
| reopen  |
| reopen  |
| close   |
| suspend |
| close   |
+---------+

现在,我想按记录组的状态对其进行计数。 但有一个变化是,我想对打开重新打开进行计数,就像它们在同一组中一样。

所以我执行下面的查询。

SELECT 
 status,COUNT(*)
FROM 
 Task
GROUP BY status

A)我得到了什么。

B)我想要什么。

A)                      B)
+---------+---------+   +---------+---------+
| status  | count   |   | status  | count   |
+---------+---------+   +---------+---------+
| open    | 1       |   | open    | 3       |
| reopen  | 2       |   | close   | 2       |
| close   | 2       |   | suspend | 1       |
| suspend | 1       |   +---------+---------+
+---------+---------+   

正如你在上面的 A) 中看到的,我得到了查询的结果。 但我想在打开它自己时统计重新打开的记录。 您可以在 B) 中看到。

还有一件事我不希望按水平顺序进行计数。 你已经尝试过了。下面的查询将起作用。

C) 
SELECT
  COUNT(case status when 'open' then 1 when 'reopen' then 1 else null end) as open
  COUNT(case status when 'close' then 1 else null end) as close,
  COUNT(case status when 'suspend' then 1 else null end) as suspend
FROM
  Task
+---------+---------+---------+
| open    | close   | suspend |
+---------+---------+---------+
| 3       | 2       | 1       |
+---------+---------+---------+

所以我的问题是如何在不使用选项 C) 的情况下实现上面提到的 B) ?

你可以试试这个sqlfiddle http://sqlfiddle.com/#!9/fdf820

最佳答案

选项 C 实在是太过分了。您所需要做的就是将“重新打开”转换为“打开”

SELECT   CASE status WHEN 'reopen' THEN 'open' ELSE status END, COUNT(*)
FROM     task
GROUP BY CASE status WHEN 'reopen' THEN 'open' ELSE status END

关于mysql - 使用 SQL 的 GROUP BY 子句时计算单个组中多个不同值的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39212175/

相关文章:

php - 使用 mysql 中另一个表中的相似数据更新新数据库表的语法

c# - 使用 C# sql 对表的特定列的行进行求和

mysql - 计算同一个表上的行之间的平均时间差

sql - 多对多自引用选择sql查询

php - For循环不返回所有值

mysql - RethinkDb 等效于日期之间的过滤器

sql - 我们认为什么是动态 sql 语句?

ios - 在移动 Safari 上关闭软件键盘后,带有选项的 <select> 标签位置错误

mysql - 在 MySQL 查询中使用带有 Where 子句的 Cases

mysql - SELECT IN 带有空子查询,给出奇怪的结果