#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:
Вы были почти на месте! Я внес несколько изменений:
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)