sql - 选择计数(不同)返回不正确的计数
问题描述
我正在尝试运行一个代码,该代码将根据年龄类别汇总客户列表。我有客户 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
我究竟做错了什么?
解决方案
我怀疑您实际上应该按 聚合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;
请注意,我已经重写了您的查询以使用显式、现代、内部连接,而不是您使用的隐式连接。
推荐阅读
- javascript - 如何在单击时克隆和附加字段
- c# - SSIS 包在 SSDT 中工作,但在我部署后无法在 SQL Server 中工作
- php - 选择标签上的元素更改时如何调用模型
- javascript - 访问数组中的对象属性
- android - android studio 3.3.2 svg 崩溃:充气时出现异常
android.content.res.Resources$NotFoundException: - docker - 如何在 docker-swarm 管理器上访问本地构建的 docker-image?
- sql - 来自远程服务器和服务器上的相同查询,不同的结果
- rust - 有没有更简洁的方式来格式化 .expect() 消息?
- python - 如何处理列中的unicode值dict
- php - 使用 Angular 和 php 上传文件时面临错误