如何在mysql中使用case stament计数

yeotifhr  于 2021-06-15  发布在  Mysql
关注(0)|答案(3)|浏览(277)

我有以下问题

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;

有没有什么建议,我怎样才能和案件一起计算,并得到预期的结果?

iqjalb3h

iqjalb3h1#

尝试嵌入式选择,

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;
7gyucuyw

7gyucuyw2#

做那件事 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
wf82jlnq

wf82jlnq3#

我会这样写:

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 有任何列被命名为 A 或者 R 等等。
在中使用直接日期比较,而不是日期函数 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导致意外结果的可能性。

相关问题