我有以下查询
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;
有什么建议我应该如何计算案例并获得理想的结果?
答案 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
有任何名为A
或R
的列,依此类推,您的代码将无法工作。WHERE
子句中的日期函数。这样可以改善优化。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;