SQL技术问询:如何统计指定日期下所有FilledBy值均为0的患者总数及列值总和为0的表的去重记录计数
问题1:如何从某列总和为0的表中获取去重记录的计数?
分两种常见场景给你解决方案:
场景1:按分组统计,分组内目标列总和为0
比如有一张Orders表,包含CustomerId(客户ID)和Amount(订单金额),要统计所有订单金额总和为0的客户数量:SELECT COUNT(DISTINCT CustomerId) AS ZeroTotalCustomerCount FROM Orders GROUP BY CustomerId HAVING SUM(Amount) = 0;这里用
GROUP BY按客户分组,HAVING SUM(Amount) = 0筛选出总和为0的客户组,最后用COUNT(DISTINCT)统计去重的客户数量(如果每个客户仅对应一个分组,直接用COUNT(*)也可以)。场景2:整个表的目标列总和为0,统计某列的去重记录数
如果是整个表的目标列总和为0,要统计另一列的去重数量,直接用COUNT(DISTINCT)即可:SELECT COUNT(DISTINCT TargetColumn) AS DistinctCount FROM YourTable WHERE SUM(Amount) OVER () = 0;这种场景比较少见,通常还是分组统计的需求更普遍。
问题2:统计指定日期下所有CheckListActivity记录FilledBy均为0的患者总数
先说说你原来查询的问题:你的语句只筛选了FilledBy = 0的记录再分组,这会把那些有部分记录FilledBy为0但存在非0记录的患者(比如测试数据里的103)也统计进去,不符合“所有记录FilledBy均为0”的要求。
下面给你两种高效的解决方法:
方案1:使用NOT EXISTS(逻辑清晰,推荐)
SELECT COUNT(DISTINCT p.PatientId) AS PatientCnt FROM [dbo].[da.Patient] p WHERE CONVERT(Date, p.DischargeDate) = '2021-05-02' AND NOT EXISTS ( SELECT 1 FROM [dbo].[da.CheckListActivity] cla WHERE cla.PatientId = p.PatientId AND cla.FilledBy <> 0 );
逻辑说明:
- 先筛选出2021-05-02出院的患者;
- 用
NOT EXISTS检查该患者是否存在任何一条FilledBy不等于0的记录——如果不存在,说明该患者所有检查记录的FilledBy都是0,符合条件; - 最后统计这类患者的去重数量。
方案2:使用GROUP BY + HAVING(适合聚合统计场景)
SELECT COUNT(DISTINCT cla.PatientId) AS PatientCnt FROM [dbo].[da.CheckListActivity] cla JOIN [dbo].[da.Patient] p ON cla.PatientId = p.PatientId WHERE CONVERT(Date, p.DischargeDate) = '2021-05-02' GROUP BY cla.PatientId HAVING COUNT(CASE WHEN cla.FilledBy <> 0 THEN 1 END) = 0;
逻辑说明:
- 关联患者表和检查活动表,筛选出指定日期出院患者的所有检查记录;
- 按患者分组,用
CASE语句统计每组中FilledBy不等于0的记录数; HAVING子句筛选出“非0记录数为0”的分组,也就是所有记录FilledBy都是0的患者;- 最后统计这些患者的数量。
这两种方案都能得到你期望的结果:PatientCnt = 2(对应患者102、104)。
内容的提问来源于stack exchange,提问作者prem
相关产品推荐
相关产品推荐

