我有一个有趣的查询要做,我正在努力找到最好的方法来做到这一点。基本上我在人事数据库中有一个缺席表,它记录了员工ID,然后是缺勤的开始日期和结束日期。如果尚未输入(未返回),则结束日期为空。我无法改变设计。
他们希望按月报告缺勤人数(12个月的趋势)。由于工作人员在一个月内发生变化,显然可能难以计算。
e.g。工作人员于2008年11月25日至2008年12月5日期间(年/月/日)我希望11月份的日子能够进入11月份的计数,而12月份的那些日子则计入12月份的数量。
我目前正在考虑计算将开始日期和结束日期分成缺席每一天的记录所需的天数,将其分配到它所在的月份。然后将数据分组以进行报告。至于没有结束日期的那些我会假设null是当前日期,因为它们目前仍然不存在。
最好的方法是什么?
有更好的方法吗?
编辑:这是当前的SQL 2000服务器。希望很快升级。
答案 0 :(得分:3)
我遇到过类似的问题,其中有一个开始/结束日期表,专门用于数据存储但不用于报告。
我找到了“执行速度最快”的解决方案,发现它是在那里创建一个包含每月值的第二个表。我用2000年1月到2070年1月的几个月来填充它。我预计它就足够了,或者我将在2070年获得大额支票并更新它......
DECLARE TABLE months (start DATETIME)
-- Populate with all month start dates that may ever be needed
-- And I would recommend indexing / primary keying by start
SELECT
months.start,
data.id,
SUM(CASE WHEN data.start < months.start
THEN DATEDIFF(DAY, months.start, data.end)
ELSE DATEDIFF(DAY, data.start, DATEADD(month, 1, months.start))
END) AS days
FROM
data
INNER JOIN
months
ON data.start < DATEADD(month, 1, months.start)
AND data.end > months.start
GROUP BY
months.start,
data.id
由于各种原因,这种加入可能会很慢,我会搜索另一个问题的另一个答案,以说明为什么以及如何优化加入。
编辑:
以下是与重叠日期范围以及如何加速联接有关的另一个答案......