Mysql подсчитывает различные идентификаторы в сумме(если())

#mysql

Вопрос:

У меня есть следующие таблицы.

Случай

ID Имя
1 Антон
2 Elfriede
3 Осрам

Назначения

ID Продолжительность Случай
1 70 1
2 70 2

Fastdocu без предварительной записи

ID Продолжительность Случай
1 15 2
2 15 2
3 50 3
3 8 3

Мне нужно суммировать всю продолжительность и все встречи, а также дела, которые не записаны на прием.

Результат должен быть

Продолжительность 88
Встреч 3
Случая 1

Следующее заявление, которое я написал

 Select sum(duration), count(DISTINCT ID), SUM(IF(`Case` NOT IN (1,2),1,0)) From Fastdocu
 

Внезапно результат таков

Продолжительность 88
Встреч 3
Случая 2

Я должен суммировать только отдельные идентификаторы при подсчете обращений. Но, по-видимому, в if это различие запрещено. Как я могу правильно подсчитать случаи?

Комментарии:

1. CASE это зарезервированное слово в MySQL . Заключите его в обратные галочки, чтобы использовать в качестве идентификатора.

2. Добавили побег. Спасибо за информацию.

Ответ №1:

Используйте COUNT() с CASE выражением вместо SUM() :

 SELECT SUM(duration) total_duration, 
       COUNT(DISTINCT ID) distinct_ids, 
       COUNT(DISTINCT CASE WHEN `Case` NOT IN (1,2) THEN `Case` END) cases_not_in_Appointments 
FROM Fastdocu
 

Поскольку COUNT() у него нет ELSE ветви, он не будет считать Case s, которые не удовлетворяют условию Case NOT IN (1,2) , потому что в этом случае результатом CASE выражения будет NULL .

Если вы хотите посчитать отдельные id s, а не отдельные Case s, измените значение на:

 COUNT(DISTINCT CASE WHEN `Case` NOT IN (1,2) THEN ID END) 
 

Смотрите демонстрацию.
Результаты:

total_duration distinct_ids Случаи не_в_приложениях
88 3 1

Комментарии:

1. Проголосовали против, но это может потребовать некоторого объяснения. CASE Выражение без ELSE предложения возвращает значение NULL, если ни одно выражение не сопоставлено, и COUNT() игнорирует значения NULL.

2. @БиллКарвин справедливое замечание. Я добавил краткое объяснение.

3. Может быть, мы можем использовать двойные случаи, чтобы это выглядело как ПОДСЧЕТ(ОТДЕЛЬНЫЙ СЛУЧАЙ, КОГДА Case НЕ В (1,2), А ЗАТЕМ Case КОНЕЧНЫЙ СЛУЧАЙ, КОГДА Case В (1,2), А ЗАТЕМ 0 КОНЕЦ )

4. @Collie-ITAnneK. Фрей, это синтаксически неверно. Зачем вам 2 — й СЛУЧАЙ?

5. Хорошо, я не понял еще одно предложение ответа.