如何修改SQL实现每日仅计1条记录的员工工作天数统计
员工工作天数统计SQL修改方案
原统计逻辑直接计数符合筛选条件的班次记录总数,会导致同一日期存在多条有效班次时重复计数,无法准确核算实际工作天数。要实现「同一日期下无论多少条符合条件的记录仅计数1次」的规则,有两种常用实现方式:
方案1:去重计数(最简写法,适配当前需求)
直接将原语句的COUNT(*)替换为COUNT(DISTINCT DATO),数据库会自动对符合筛选条件的日期去重后再统计总数,写法最简单,性能也最优。
修改后的完整SQL:
SELECT COUNT(DISTINCT DATO) AS actual_work_days FROM dbo.dutyrostershift WHERE employeeid = 1931 AND DATO BETWEEN '20210901' AND '20220831' AND shifttype IN (0,1,4,5,6,15,16,20)
边界提示:如果
DATO字段是带时分秒的datetime/datetime2类型,原写法的BETWEEN '20210901' AND '20220831'会漏算2022年8月31日0点之后的记录,这种场景建议把时间范围条件调整为DATO >= '20210901' AND DATO < '20220901',统计结果更准确。如果DATO是纯date类型则无需调整。
方案2:分组聚合后计数(扩展性更强)
如果后续需要扩展统计维度,比如同时统计每个工作日的班次数量、最早/最晚班次时间等,可以先按日期分组去重,外层再统计分组总数,逻辑和方案1完全等价,更方便后续扩展字段。
写法示例:
SELECT COUNT(*) AS actual_work_days FROM ( SELECT DATO FROM dbo.dutyrostershift WHERE employeeid = 1931 AND DATO BETWEEN '20210901' AND '20220831' AND shifttype IN (0,1,4,5,6,15,16,20) GROUP BY DATO ) AS daily_shift
内容的提问来源于stack exchange,提问作者Edvard Korsbæk
相关产品推荐
相关产品推荐

