如何在带有CASE台词的MySQL中进行计数

时间:2018-12-05 15:15:23

标签: mysql sql count case mysql-workbench

我有以下查询

SELECT CASE u.situacionUsuario 
    WHEN "A" THEN 'ALTA'
    WHEN "R" THEN 'ALTA'
    WHEN "S" THEN 'ALTA'
    WHEN "B" THEN 'BAJA'
    WHEN "T" THEN 'BAJA'
    ELSE NULL
    END AS Situacion
FROM Usuario u
WHERE 
YEAR(u.fechaAsistencia)=2018 AND MONTH(u.fechaAsistencia) BETWEEN 01 AND 12
GROUP BY u.situacionUsuario, u.usuario;

返回此结果

-Situacion-
|ALTA     |
|ALTA     |
|ALTA     |
|ALTA     |
|ALTA     |
|ALTA     |
|BAJA     |
|BAJA     |
|ALTA     |
|ALTA     |
|ALTA     |
|BAJA     |
|ALTA     |
|ALTA     |
|ALTA     |
----------

我想要的结果就是这个。

-Situacion-TOTAL-|
|ALTA     |12    |
|BAJA     |3     |
-----------------

我使用了COUNT,但没有返回我想要的结果

SELECT CASE u.situacionUsuario 
        WHEN "A" THEN 'ALTA'
        WHEN "R" THEN 'ALTA'
        WHEN "S" THEN 'ALTA'
        WHEN "B" THEN 'BAJA'
        WHEN "T" THEN 'BAJA'
        ELSE NULL
        END AS Situacion,
    COUNT (CASE u.situacionUsuario 
        WHEN "A" THEN 'ALTA'
        WHEN "R" THEN 'ALTA'
        WHEN "S" THEN 'ALTA'
        WHEN "B" THEN 'BAJA'
        WHEN "T" THEN 'BAJA'
        ELSE NULL
        END) AS Total
    FROM Usuario u
    WHERE 
    YEAR(u.fechaAsistencia)=2018 AND MONTH(u.fechaAsistencia) BETWEEN 01 AND 12
    GROUP BY Situacion;

有什么建议我应该如何计算案例并获得理想的结果?

3 个答案:

答案 0 :(得分:2)

在派生表中执行CASE部分。 GROUP BY其结果:

select Situacion, count(*) as TOTAL
from
(
    SELECT CASE u.situacionUsuario 
        WHEN "A" THEN 'ALTA'
        WHEN "R" THEN 'ALTA'
        WHEN "S" THEN 'ALTA'
        WHEN "B" THEN 'BAJA'
        WHEN "T" THEN 'BAJA'
        ELSE NULL
        END AS Situacion
    FROM Usuario u
    WHERE 
    YEAR(u.fechaAsistencia)=2018 AND MONTH(u.fechaAsistencia) BETWEEN 01 AND 12
) dt
GROUP BY Situacion

答案 1 :(得分:1)

我会这样写:

SELECT (CASE u.situacionUsuario 
           WHEN 'A' THEN 'ALTA'
           WHEN 'R' THEN 'ALTA'
           WHEN 'S' THEN 'ALTA'
           WHEN 'B' THEN 'BAJA'
           WHEN 'T' THEN 'BAJA'
        END) AS Situacion,
       COUNT(*) AS Total
FROM Usuario u
WHERE u.fechaAsistencia >= '2018-01-01' AND
      u.fechaAsistencia < '2019-01-01' 
GROUP BY Situacion;

注意:

  • 字符串应以单引号分隔。例如,如果Usuario有任何名为AR的列,依此类推,您的代码将无法工作。
  • 尽可能使用直接日期比较代替WHERE子句中的日期函数。这样可以改善优化。
  • MySQL支持GROUP BY中的列别名。
  • 我不确定如果行为0为何要NULL,所以只使用COUNT(*)作为总数。
  • ELSE NULL是多余的。我认为它不会为查询添加任何内容。

我实际上可以简化为:

SELECT (CASE WHEN u.situacionUsuario IN ('A', 'R', 'S') THEN 'ALTA'
             WHEN u.situacionUsuario IN ('B', 'T')  THEN 'BAJA'
        END) AS Situacion,
       COUNT(*) AS Total
FROM Usuario u
WHERE u.fechaAsistencia >= '2018-01-01' AND
      u.fechaAsistencia < '2019-01-01' 
GROUP BY Situacion;

这减少了查询中出现tpo导致意外结果的可能性。

答案 2 :(得分:0)

尝试嵌入选择

select Situacion, count(Situacion) from (

SELECT CASE u.situacionUsuario 
    WHEN "A" THEN 'ALTA'
    WHEN "R" THEN 'ALTA'
    WHEN "S" THEN 'ALTA'
    WHEN "B" THEN 'BAJA'
    WHEN "T" THEN 'BAJA'
    ELSE NULL
    END AS Situacion
FROM Usuario u
WHERE 
YEAR(u.fechaAsistencia)=2018 AND MONTH(u.fechaAsistencia) BETWEEN 01 AND 12

) group by Situacion;