Я пытаюсь запустить код, который будет обобщать список клиентов на основе возрастных категорий. У меня есть идентификатор клиента и его возраст, и я использую CASE WHEN для группировки возрастов в сегменты, а затем пытаюсь подсчитать идентификаторы клиентов в каждом из этих сегментов.

Для информации - поле «Дата получения помощи» - это просто дата, когда клиент был обслужен, и это просто включено в мое тестирование, чтобы сохранить небольшие результаты - поэтому я просто сосредоточился на сервисах февраля 2019 года, которые не являются оценками; и идентификатор SIR - это место, в котором была оказана услуга.

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 года. Таким образом, дело, когда, кажется, работает правильно.

Однако, если я запускаю код с подсчетом (отличным), я получаю 3 строки данных. возрастная группа 18-24 года указана 3 раза, а число 3, 4 и 5 соответственно для 3 строк. У меня определенно есть 17 разных идентификаторов в списке, но по какой-то причине это уменьшается до 11, когда я добавляю количество (отдельно).

Я также попытался удалить отличное от выбора, т.е.

select 
    CASE
        when CD.Age between ....

Если я сделаю это, я получу 5 рядов - все еще с возрастной группой 18-24, но затем с 2,4,5,4,2 соответственно - так что вернусь к моему общему количеству 17. Но я не уверен, почему я ' я не просто получаю одну строчку назад: возрастная группа: 18-24; Количество: 17

Что я делаю не так?

0
Nic 30 Май 2019 в 08:14

2 ответа

Лучший ответ

Вы должны поместить свое заявление в вашем group by. На самом деле, так как вы group by CD.Age напишете одну строку для каждого отдельного возраста. Другими словами, если у вас есть две строки с Age = 12 и одна строка с Age = 13, вы получите две строки, обе с 12-14 в качестве их возрастной группы, но с количеством {{X5) }} для первого и 1 для второго. Чтобы сделать это более запутанным, если у вас была только одна строка в каждой, то, поскольку обе строки одинаковы и у вас есть предложение distinct, будет возвращаться только 1 строка с количеством, равным 1.

Если вы поместите свой оператор case в группу by, он будет группироваться по каждому отдельному 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
0
Ben 30 Май 2019 в 05:26

Я подозреваю, что на самом деле вы должны агрегировать по 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;

Обратите внимание, что я переписал ваш запрос, чтобы использовать явные, современные внутренние объединения, а не неявные соединения, которые вы использовали.

1
Tim Biegeleisen 30 Май 2019 в 05:26