MS Access多查询合并:按年月统计筛选结果分列显示求助
按年月多维度统计患者入组数据的SQL解决方案
正确的查询代码
SELECT Year([dtmApproach]) AS [Year], Month([dtmApproach]) AS [Month], COUNT(IIF(tblScreening.intCode IN (1,2), tblScreening.intMMID, NULL)) AS [# Consented], COUNT(IIF(tblScreening.intCode IN (1,2) AND tblScreening.intPayer = 2, tblScreening.intMMID, NULL)) AS [# Medicare], COUNT(IIF(tblScreening.intCode IN (1,2) AND tblScreening.strHospital IN ('目标医院1', '目标医院2'), tblScreening.intMMID, NULL)) AS [# From Select Hospitals] FROM tblScreening GROUP BY Year([dtmApproach]), Month([dtmApproach]) ORDER BY Year([dtmApproach]), Month([dtmApproach]);
问题分析与说明
为什么UNION不适用
UNION的作用是将多个查询的结果按行合并,而你的需求是在同一行展示年月对应的三个统计值,这种场景下用UNION完全错误,反而会把不同统计维度的数据拆成多行,不符合目标输出格式。原查询报错的原因
你第一个SELECT语句缺少GROUP BY Year([dtmApproach]), Month([dtmApproach])子句。Access SQL规定:当SELECT语句中同时包含聚合函数(如COUNT)和非聚合字段(如Year([dtmApproach]))时,所有非聚合字段必须出现在GROUP BY中,否则会抛出你遇到的错误。条件聚合的逻辑
这里用IIF函数配合COUNT实现条件统计:# Consented:筛选intCode为1或2的同意入组患者,符合条件时返回患者ID,否则返回NULL,COUNT会自动忽略NULL值,得到对应年月的同意入组总数。# Medicare:在同意入组的基础上,额外添加intPayer=2的筛选条件,统计同时满足两个条件的患者数。# From Select Hospitals:将('目标医院1', '目标医院2')替换为你需要统计的特定医院名称,筛选同意入组且来自这些医院的患者数。
内容的提问来源于stack exchange,提问作者Mushroom495
相关产品推荐
相关产品推荐

