выберите количество (различное), возвращающее неправильное количество - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь запустить код, который будет обобщать список клиентов по возрастным категориям. У меня есть идентификатор клиента и его возраст, и я использую 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

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

Ответы [ 2 ]

1 голос
/ 30 мая 2019

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

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

0 голосов
/ 30 мая 2019

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

Если вы поставитеВаше утверждение case в group 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...