Использование COUNT CASE WHEN MONTH в выражении MariaDB 10.2.15 - PullRequest
0 голосов
/ 13 марта 2019

Я создал запрос для расчета суммы идентификатора в таблице , используя COUNT, CASE, WHEN и MONTH ..

Код:

SELECT
    COUNT(CASE WHEN MONTH(LogsFormatted.DateIn) = 1 THEN LogsFormatted.Id ELSE 0 END ) AS '1',
    COUNT(CASE WHEN MONTH(LogsFormatted.DateIn) = 2 THEN LogsFormatted.Id ELSE 0 END ) AS '2'
FROM
    HrAttLogsFormatted AS LogsFormatted
WHERE
    LogsFormatted.DateIn BETWEEN '2019-01-01' AND '2019-02-31'
    AND LogsFormatted.Late != ''

Выход:

| 1    | 2    |
| 1378 | 1378 |

Вывод, который я хочу сделать, заключается в вычислении идентификатора в каждом месяце , а именно месяце 1 и месяце 2

| 1    | 2    |
| 792  | 586  |

Данные выше являются фактом

Использование указанного выше запроса вместо суммирования приводит к результатам расчета месяца 1 и месяца 2

Ответы [ 3 ]

1 голос
/ 13 марта 2019

удалить другую часть из случая, когда выражение - если вы используете другое с 0, то count также учитывает это, что дает вам фактически неправильный вывод

SELECT
    COUNT(CASE WHEN MONTH(LogsFormatted.DateIn) = 1 THEN LogsFormatted.Id END ) AS '1',
    COUNT(CASE WHEN MONTH(LogsFormatted.DateIn) = 2 THEN LogsFormatted.Id  END ) AS '2'
FROM
    HrAttLogsFormatted AS LogsFormatted
WHERE
    LogsFormatted.DateIn BETWEEN '2019-01-01' AND '2019-02-31'
    AND LogsFormatted.Late != ''
1 голос
/ 13 марта 2019

Вы должны считать NULL, когда критерии в вашем выражении CASE не совпадают. Кроме того, я предпочитаю считать 1, если вы действительно не хотите считать сами идентификаторы. Эта версия должна работать:

SELECT
    COUNT(CASE WHEN MONTH(lf.DateIn) = 1 THEN 1 END) AS '1',
    COUNT(CASE WHEN MONTH(lf.DateIn) = 2 THEN 1 END) AS '2'
FROM HrAttLogsFormatted AS lf
WHERE
    lf.DateIn BETWEEN '2019-01-01' AND '2019-02-31' AND
    lf.Late != '';

Обратите внимание, что текущее значение, которое вы видите, равно сумме отдельных значений, то есть:

1378 = 792 + 586

Причиной этого является то, что функция COUNT "считает" любое не NULL значение как 1, а любое NULL значение как ноль. Ваше текущее CASE выражение будет всегда считать 1, для каждой записи в таблице.

0 голосов
/ 13 марта 2019

Если вы используете MariaDB, я бы просто использовал SUM() с логическим значением:

SELECT SUM( MONTH(lf.DateIn) = 1 ) as month_1,
       SUM( MONTH(lf.DateIn) = 2 ) as month_2
FROM HrAttLogsFormatted lf
WHERE lf.DateIn >= '2019-01-01' AND 
      lf.DateIn < '2020-01-01' AND
      lf.Late <> '';

Это предполагает, что подсчитываемый вами идентификатор никогда не будет NULL (разумное предположение для идентификатора).

Обратите внимание на другие изменения:

  • Псевдонимы столбцов не должны быть экранированы.Не используйте нестандартные имена, если они не нужны - по какой-то причине - для последующей обработки.
  • При этом используется более короткий псевдоним таблицы, поэтому запрос легче писать и читать.
  • При сравнении дат используются неравенства, поэтому это работает как для date s, так и для datetime s.
  • <> - это стандартный оператор сравнения SQL для неравенства.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...