【问题标题】:Count of more then one different values in a single group when using GROUP BY clause of SQL使用 SQL 的 GROUP BY 子句时单个组中多个不同值的计数
【发布时间】:2017-01-05 20:01:40
【问题描述】:

假设我的表中有以下数据。

表名:任务

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

现在,我想按记录组的状态对其进行计数。 但是有一个变化,我想把 openreopen 算在同一组中。

所以我在下面执行这个查询。

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) 中看到的那样,我得到了查询的结果。 但我想在 open it self 中计算重新打开的记录。 你可以在 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

【问题讨论】:

    标签: mysql sql select count group-by


    【解决方案1】:

    选项 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
    

    【讨论】:

      【解决方案2】:

      首先感谢@Mureinik ,然后按照他的回答

      我发现不需要在投影中传递CASE。 所以这个查询也可以工作。可能这个效率更高。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-28
        • 1970-01-01
        • 2022-09-29
        相关资源
        最近更新 更多