Как СЧЕТИТЬ в MySQL с CASE stament - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть следующий запрос

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;

Любое предложение, как я могу COUNT с делами и получить желаемый результат?

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

попробуйте встроенный выбор,

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;
0 голосов
/ 05 декабря 2018

Я бы написал так:

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;

Это уменьшает вероятность появления запроса в запросе, приводящего к неожиданным результатам..

0 голосов
/ 05 декабря 2018

Выполнить часть 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
...