Условное КОЛИЧЕСТВО в операторе CASE

#sql #tsql

#sql #tsql

Вопрос:

Таблица 1 — это список клиентов, их членство, используемая ими служба и дата использования службы

Таблица 2 — это просто таблица 1, сгруппированная по месяцам и типу членства, затем количество сеансов обслуживания

То, что я пытаюсь сделать, это подсчитывать сеансы членства только по определенным типам сервисов. Это то, что у меня есть на данный момент, оно возвращает ошибку, в которой говорится, что ‘Service_Type’ отсутствует в агрегатной функции или предложении group by, когда я помещаю ‘Service_Type’ в group by, запрос не содержит ошибок, но в столбце SESSIONS все значения равны НУЛЮ.

 SELECT 
  DATEFROMPARTS(YEAR(t1.Date),MONTH(t1.Date),1)AS 'Draft_Date', 
  Membership,
  CASE 
    WHEN Membership = 5 AND Service_Type = 'A' THEN COUNT(*)
    WHEN Membership = 2 AND Service_Type IN ('J','C')
  END AS'SESSIONS' 
FROM Table1 t1 
GROUP BY DATEFROMPARTS(YEAR(t1.Date),MONTH(t1.Date),1),Membership
  

Инструкция case будет включать все членства и типы сервисов, но я думаю, что этого достаточно для моего примера. Любая помощь была бы высоко оценена! Я работал над этим несколько дней.

Таблица 1
Таблица 1

Таблица 2
Таблица 2

Ответ №1:

Вы были почти на месте! Я внес несколько изменений:

 SELECT 
  DATEFROMPARTS(YEAR(t1.Date), MONTH(t1.Date),1) AS Draft_Date, 
  Membership,
  COUNT(CASE WHEN t1.Membership = 5 AND t1.Service_Type = 'A' THEN 1 END) as m5stA,
  COUNT(CASE WHEN t1.Membership = 2 AND t1.Service_Type IN ('J','C') THEN 1 END) as m2stJC
FROM Table1 t1 
GROUP BY YEAR(t1.Date), MONTH(t1.Date), Membership
  

Изменения:

  • Избегайте использования апострофов для псевдонимов имен столбцов, используйте стандартные ascii «двойные кавычки, если необходимо
  • При выполнении условного подсчета поместите счетчик вне РЕГИСТРА WHEN и пусть значение case when возвращает что-либо (подойдет любое значение, отличное от null — я использовал 1, но это также могло быть ‘x’ и т.д.), Когда условие выполнено. Не указывайте ELSE — CASE, КОГДА будет возвращено значение null, если ELSE отсутствует и условие не выполнено, а нули не учитываются (вы также можете написать ELSE NULL , хотя это избыточно)
  • Всегда указывайте имена всех ваших столбцов — это помогает поддерживать работоспособность запроса при добавлении новых таблиц в будущем или даже при добавлении новых столбцов с такими же именами в существующие таблицы
  • Вы забыли THEN во втором WHEN
  • Вам не обязательно группировать По выходным данным DATEFROMPARTS. Когда используется детерминированная функция (всегда выдает один и тот же результат на одних и тех же входных данных), база данных достаточно умна, чтобы знать, что группировка на входных данных также хороша
  • Кстати, данные вашего примера не содержали никаких данных, которые позволили бы подсчитать количество 1 , но я уверен, что у вас будут другие условные подсчеты, которые сработают (это просто усложнило тестирование)

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

1. Спасибо вам за решение и другие заметки, которые отлично сработали!

Ответ №2:

используйте sum

 SELECT DATEFROMPARTS(YEAR(t1.Date),MONTH(t1.Date),1) AS Draft_Date , Membership,
sum(CASE WHEN Membership = 5 AND Service_Type = 'A' THEN 1  else 0 end),
sum(case WHEN Membership = 2 AND Service_Type IN ('J','C') then 1 else 0 end)

FROM Table1 t1 group by DATEFROMPARTS(YEAR(t1.Date),MONTH(t1.Date),1)