如何在Access交叉表(Crosstab)查询中包含计数为零的时段
可以实现,核心逻辑是先构造覆盖所有日期+24小时的基准行集合,再左关联就诊业务数据做统计,无匹配的时段统计值自动为0,具体操作如下:
步骤1:准备24小时参考序列
你可以二选一:
- 方案1:新建辅助表
HourLookup,仅含整型字段HourOD,依次存入0~23共24条记录,复用性更高 - 方案2:用联合查询临时生成24小时序列,无需建表:
SELECT 0 AS HourOD UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12 UNION SELECT 13 UNION SELECT 14 UNION SELECT 15 UNION SELECT 16 UNION SELECT 17 UNION SELECT 18 UNION SELECT 19 UNION SELECT 20 UNION SELECT 21 UNION SELECT 22 UNION SELECT 23
步骤2:修改交叉表查询
以下是调整后的完整查询语句(默认使用方案1的HourLookup辅助表,替换为方案2的联合查询也可运行):
TRANSFORM Nz(Count([ServiceEncounterID]),0) AS CountOfServiceEncounterID SELECT t.DOY, t.HourOD FROM -- 全量日期+24小时的基准组合 ( SELECT DISTINCT DateValue([EDRegistrationDtm]) AS DOY, HourLookup.HourOD FROM HisDataModel, HourLookup ) AS t -- 左关联业务表,无就诊记录的时段对应字段为NULL LEFT JOIN HisDataModel AS HisDataModel_1 ON DateValue(HisDataModel_1.[EDRegistrationDtm]) = t.DOY AND HisDataModel_1.HourOD = t.HourOD GROUP BY t.DOY, t.HourOD ORDER BY t.DOY, t.HourOD PIVOT HisDataModel_1.Stream;
修改后查询会自动补全所有日期对应的24小时行,无就诊记录的时段各Stream分类的统计值均为0。
内容的提问来源于stack exchange,提问作者Colin
相关产品推荐
相关产品推荐

