mysql sum,与GROUP BY时为CASE

时间:2019-01-02 08:18:51

标签: mysql

在MySQL中,我想对某些状态的值求和并将它们显示在同一计数列中,

我必须给一个计数条件吗?!

状态为0、1、2和3,状态= 2是2、3、4个计数值的总和。

我应该给什么样的条件?

我的查询:

SELECT A.STATUS, B.COUNT, B.REG_DT FROM 
(SELECT 0 AS STATUS UNION ALL  SELECT 1 UNION ALL  SELECT 2 UNION ALL  SELECT 3 UNION ALL  SELECT 4) A
   LEFT JOIN (
      SELECT STATUS , COUNT(*) AS COUNT, FROM TB_EXE WHERE reg_dt >=  CURDATE() 
      GROUP BY STATUS
) B ON A.STATUS = B.STATUS

我的数据:

  status |  count           
 -----------------      
    0    |    1         
 -----------------      
    1    |    2         
 -----------------      
    2    |    1         
 -----------------
    3    |    0
 -----------------
    4    |    2

预期结果:

  status |  count
 -----------------
    0    |    1
 -----------------
    1    |    2
 -----------------
    2    |    3

3 个答案:

答案 0 :(得分:0)

您可以在以下情况下尝试以下情况

select case when status>1 then 2 else status end as status,
sum(count) as cnt from t
group by status

答案 1 :(得分:0)

SELECT STATUS,COUNT(*)
 FROM T
 WHERE STATUS < 2
 GROUP BY STATUS
 UNION ALL
 (SELECT 2,COUNT(*)
 FROM T
 WHERE STATUS >= 2
  ) 

分别处理这两个聚合的地方。

+--------+----------+
| STATUS | COUNT(*) |
+--------+----------+
|      0 |        1 |
|      1 |        1 |
|      2 |        3 |
+--------+----------+
3 rows in set (0.00 sec)

或更简洁

 select case when status > 1 then 2 else status end, count(*)
  from t
  group by case when status > 1 then 2 else status end

答案 2 :(得分:0)

嗯,我想我会为此提供一种框架解决方案。 IE就是这样:

SELECT 
  Status,
  Count,
  SUM(Count) OVER(ORDER BY status ROWS
       BETWEEN UNBOUNDED PRECEDING
       AND CURRENT ROW) AS FramedCount
FROM Status

这将为您提供前所有行的累计计数作为框架计数。您可以处理应用程序中的逻辑以确定应该使用框架计数的状态,或者可以通过添加以下内容在查询中处理它。

SELECT 
  status,
  CASE
    when status <= 3 THEN count
    ELSE SUM(count) OVER(ORDER BY status ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
    END AS 'MyCount'
FROM statusInfo