Я пытаюсь запустить код, который будет суммировать список клиентов на основе возрастных категорий. У меня есть идентификатор клиента и его возраст, и я использую CASE WHEN для группировки возрастов в сегменты, а затем пытаюсь подсчитать идентификаторы клиентов в каждом из этих сегментов.
Для информации: поле «Дата помощи» — это просто дата, когда клиент был обслужен, и это просто включено в мое тестирование, чтобы результаты были небольшими, поэтому я просто сосредотачиваюсь на услугах за февраль 2019 года, которые не являются оценками; а SIR ID — это место, где была предоставлена услуга.
select distinct
CASE
when CD.Age between 0 and 5 then '0-5'
when CD.Age between 6 and 11 then '6-11'
when CD.Age between 12 and 14 then '12-14'
when CD.Age between 15 and 17 then '15-17'
when CD.Age between 18 and 24 then '18-24'
when CD.Age between 25 and 54 then '25-54'
when CD.Age between 55 and 64 then '55-64'
when CD.Age > 65 then '65+'
else 'Unknown'
END AS Age_Group,
count(distinct AP.Source_Individual_ID) as "Count"
from dm.Assistance_Provided AP, rpt.ClientsDemographics CD
where CD.Source_Individual_ID = AP.Source_Individual_ID
and AP.SIR_ID = '1909'
and AP.Service_Provided <> 'Assessment'
and year(AP.Assisted_Date) = '2019'
and month(AP.Assisted_Date) = 2
group by CD.Age
Если я запускаю код, исключая количество (различное), я получаю 17 строк данных. Все 17 клиентов в возрасте от 18 до 24 лет, поэтому возрастная группа для всех клиентов возвращается как 18-24. Таким образом, Case When работает правильно.
Однако, если я запускаю код со счетчиком (различным), я получаю 3 строки данных. Возрастная группа 18–24 указана 3 раза, а количество составляет 2, 4 и 5 соответственно для 3 строк. У меня определенно есть 17 разных идентификаторов в списке, но по какой-то причине это сокращается до 11, когда я добавляю количество (отличных).
Я также попытался удалить отличие от выбора, т.е.
select
CASE
when CD.Age between ....
Если я это сделаю, я получу 5 рядов - все еще с возрастной группой 18-24, но затем с 2,4,5,4,2 соответственно - так что вернусь к моему общему количеству 17. Но я не уверен, почему я' я не просто возвращаюсь на одну строчку назад: Возрастная группа: 18-24; Количество: 17
Что я делаю неправильно?
Я подозреваю, что на самом деле вам следует агрегировать по Source_Individual
, а затем везде использовать условный подсчет:
SELECT
CD.Source_Individual_ID,
COUNT(CASE WHEN CD.Age BETWEEN 0 AND 5 THEN 1 END) AS [0-5],
COUNT(CASE WHEN CD.Age BETWEEN 6 AND 11 THEN 1 END) AS [6-11],
COUNT(CASE WHEN CD.Age BETWEEN 12 AND 14 THEN 1 END) AS [12-14],
COUNT(CASE WHEN CD.Age BETWEEN 15 AND 17 THEN 1 END) AS [15-17],
COUNT(CASE WHEN CD.Age BETWEEN 18 AND 24 THEN 1 END) AS [18-24],
COUNT(CASE WHEN CD.Age BETWEEN 25 AND 54 THEN 1 END) AS [25-54],
COUNT(CASE WHEN CD.Age BETWEEN 55 AND 64 THEN 1 END) AS [55-64]
COUNT(CASE WHEN CD.Age > 65 THEN 1 END) AS [65+],
COUNT(*) AS [Number of Clients Assisted]
FROM dm.Assistance_Provided AP
INNER JOIN rpt.ClientsDemographics CD
ON CD.Source_Individual_ID = AP.Source_Individual_ID
WHERE
AP.SIR_ID = '1909' AND
AP.Service_Provided <> 'Assessment' AND
YEAR(AP.Assisted_Date) = 2019 AND
MONTH(AP.Assisted_Date) = 2
GROUP BY
CD.Source_Individual_ID;
Обратите внимание, что я переписал ваш запрос, чтобы использовать явные, современные, внутренние соединения, а не неявные соединения, которые вы использовали.
Большое спасибо обоим! Это очень полезные ответы.
Вы должны поместить свое заявление в свой group by
. Как бы то ни было, поскольку вы group by CD.Age
, он будет писать одну строку для каждого отдельного возраста. Другими словами, если у вас есть две строки с Age = 12
и одна строка с Age = 13
, вы получите две строки, обе с 12-14
в качестве возрастной группы, но с количеством 2
для первой и 1
для второй. Чтобы сделать это еще более запутанным, если бы у вас была только одна строка в каждой, то, поскольку обе строки одинаковы и у вас есть предложение distinct
, она вернет только 1 строку со счетчиком 1.
Если вы поместите оператор case в группу по, то вместо этого он будет группироваться по каждому отдельному Age_Group
. т. е. сначала выполняет преобразование регистра, а затем группирует по нему.
Так что постарайтесь:
select
CASE
when CD.Age between 0 and 5 then '0-5'
when CD.Age between 6 and 11 then '6-11'
when CD.Age between 12 and 14 then '12-14'
when CD.Age between 15 and 17 then '15-17'
when CD.Age between 18 and 24 then '18-24'
when CD.Age between 25 and 54 then '25-54'
when CD.Age between 55 and 64 then '55-64'
when CD.Age > 65 then '65+'
else 'Unknown'
END AS Age_Group,
count(distinct AP.Source_Individual_ID) as "Number of Clients Assisted"
from dm.Assistance_Provided AP, rpt.ClientsDemographics CD
where CD.Source_Individual_ID = AP.Source_Individual_ID
and AP.SIR_ID = '1909'
and AP.Service_Provided <> 'Assessment'
and year(AP.Assisted_Date) = '2019'
and month(AP.Assisted_Date) = 2
group by CASE
when CD.Age between 0 and 5 then '0-5'
when CD.Age between 6 and 11 then '6-11'
when CD.Age between 12 and 14 then '12-14'
when CD.Age between 15 and 17 then '15-17'
when CD.Age between 18 and 24 then '18-24'
when CD.Age between 25 and 54 then '25-54'
when CD.Age between 55 and 64 then '55-64'
when CD.Age > 65 then '65+'
else 'Unknown'
END
это означает, что у вас есть только 3 отдельных индивидуальных_идентификатора в вашей таблице AP. объединение, вероятно, принесет больше идентификаторов из другой таблицы, но ваша точка доступа содержит только 3 разных.