Выберите количество (различное), возвращающее неправильное количество

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

Что я делаю неправильно?

это означает, что у вас есть только 3 отдельных индивидуальных_идентификатора в вашей таблице AP. объединение, вероятно, принесет больше идентификаторов из другой таблицы, но ваша точка доступа содержит только 3 разных.

Siavash Rostami 30.05.2019 07:25
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
148
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Большое спасибо обоим! Это очень полезные ответы.

Nic 30.05.2019 07:36
Ответ принят как подходящий

Вы должны поместить свое заявление в свой 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

Другие вопросы по теме