选择计数(不同)返回错误的计数

时间:2019-05-30 05:14:34

标签: sql sql-server

我正在尝试运行一个代码,该代码将根据年龄类别汇总客户列表。我有客户端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

如果我运行不包括count(distinct)的代码,最终将得到17行数据。这17位客户的年龄都在18-24岁之间,因此所有客户的年龄段都回到了18-24岁。因此,Case When似乎运行正常。

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

我还尝试过从选择项中删除唯一性,即

select 
    CASE
        when CD.Age between ....

如果我这样做的话,我会得到5行-仍然都是18-24岁年龄段的孩子,但是分别有2、4、5、4、2,所以我又回到了17行。但是我不确定为什么我不只回电话:年龄段:18-24;数:17

我在做什么错了?

2 个答案:

答案 0 :(得分:1)

我怀疑您实际上应该按照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 :(得分:0)

您需要将案件陈述书放在group by中。实际上,由于您group by CD.Age,它将为每个不同的年龄写一行。换句话说,如果您有Age = 12的两行和Age = 13的一行,您将得到两行,都以12-14作为年龄组,但计数为{{1 }}用于第一个,2用于第二个。更令人困惑的是,如果每行只有一行,那么由于两行都是相同的,并且您拥有1子句,它只会返回1行,计数为1。

如果将case语句放入“分组依据”,则它将按每个不同的distinct分组。即首先进行大小写转换,然后再进行分组。

所以尝试:

Age_Group