垃圾维度下的计数分组:员工假期状态统计SQL优化问询
多假期状态统计最优SQL实现方案
核心采用条件聚合方案即可满足需求,无需使用UNION ALL拼接多段查询,也不需要复杂的多字段PIVOT语法,仅一次表扫描即可完成全量统计,性能和可维护性均远高于现有UNION ALL写法,可直接扩展到全部7类假期的统计需求。
实现代码示例
SELECT Period AS 统计年份, -- 病假三类特殊状态计数 COUNT(CASE WHEN el.Sick_Leave_Desc = '缺失' THEN 1 END) AS 病假_缺失人数, COUNT(CASE WHEN el.Sick_Leave_Desc = '不适用' THEN 1 END) AS 病假_不适用人数, COUNT(CASE WHEN el.Sick_Leave_Desc = '已撤回' THEN 1 END) AS 病假_已撤回人数, -- 娱乐休假三类特殊状态计数 COUNT(CASE WHEN el.Recreation_Leave_Desc = '缺失' THEN 1 END) AS 娱乐休假_缺失人数, COUNT(CASE WHEN el.Recreation_Leave_Desc = '不适用' THEN 1 END) AS 娱乐休假_不适用人数, COUNT(CASE WHEN el.Recreation_Leave_Desc = '已撤回' THEN 1 END) AS 娱乐休假_已撤回人数, -- 看护假三类特殊状态计数 COUNT(CASE WHEN el.Carers_Leave_Desc = '缺失' THEN 1 END) AS 看护假_缺失人数, COUNT(CASE WHEN el.Carers_Leave_Desc = '不适用' THEN 1 END) AS 看护假_不适用人数, COUNT(CASE WHEN el.Carers_Leave_Desc = '已撤回' THEN 1 END) AS 看护假_已撤回人数 FROM Employee_Fact ef INNER JOIN Employee_Leave el ON ef.Employee_Leave_SK = el.Employee_Leave_PK -- 可自定义WHERE条件过滤指定统计范围,如 WHERE Period BETWEEN 2020 AND 2024 GROUP BY Period ORDER BY Period DESC;
方案优势
- 性能表现优异:仅需对事实表、维度表做1次关联扫描,相比7类假期*3种状态共21段查询拼接的UNION ALL写法,执行效率提升10倍以上,数据量越大优势越明显
- 扩展成本极低:新增假期类型仅需对应添加3行条件计数语句即可,无需调整整体查询结构
- 适配QlikView加载:输出为宽表结构,每行对应一个统计年份,每列对应一个统计指标,可直接导入QlikView生成图表,不需要额外做数据转换
内容的提问来源于stack exchange,提问作者Annette
相关产品推荐
相关产品推荐

