首页 > 解决方案 > 选择计数(不同)返回不正确的计数

问题描述

我正在尝试运行一个代码,该代码将根据年龄类别汇总客户列表。我有客户 ID 和他们的年龄,并且正在使用 CASE WHEN 将年龄分组到存储桶中,然后尝试计算每个存储桶中的客户 ID。

有关信息 - 辅助日期字段只是为客户提供服务的日期,这只是包含在我的测试中以保持结果较小 - 所以我只关注 2019 年 2 月的非评估服务;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 似乎运行正常。

但是,如果我使用 count(distinct) 运行代码,我最终会得到 3 行数据。年龄组 18-24 被列出 3 次,3 行的计数分别为 2、4 和 5。我在列表中肯定有 17 个不同的 ID,但由于某种原因,当我添加计数(不同)时,总数减少到 11 个。

我也试过从选择中删除不同的,即

select 
    CASE
        when CD.Age between ....

如果我这样做,我会得到 5 行——仍然都是 18-24 岁的年龄组,但随后分别是 2、4、5、4、2——所以回到我的总数 17。但我不知道为什么我m 不只是恢复一条线:年龄组:18-24;计数:17

我究竟做错了什么?

标签: sqlsql-server

解决方案


我怀疑您实际上应该按 聚合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;

请注意,我已经重写了您的查询以使用显式、现代、内部连接,而不是您使用的隐式连接。


推荐阅读