考虑我的表中有以下数据。
表名:任务
+---------+
| 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/