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