不要使用计算列,总天数,因为它汇总了几个月甚至几年的开始日期和结束日期之间的差异。考虑计算单独的持续时间:
- 从开始日期到开始日期月份结束的缺勤时间
- 从结束日期月份的第一天到结束日期的缺勤时间
然后将聚合连接在一起。因此,例如,缺席范围 2018 年 1 月 30 日 - 2018 年 2 月 2 日:
- 第一个查询计算从 1 月 30 日到 1 月 31 日(月末)的天数,分组到 1 月份
- 第二个查询计算从 2 月 1 日(月初)到 2 月 2 日,分组到 2 月
- 联接查询与教师、年份和月份对齐,并使用算术加法计算总持续时间
+,其中 1 月的 2 天结果和 2 月的 2 天结果在不同的行上
开始日期查询
SELECT
s.[Teacher Name] AS [Teacher],
Year(ae.[Absence End Date]) As Year_Absence,
MonthName(Month(ae.[Absence Start Date]), TRUE) As Month_Absence,
SUM(DateDiff('d', ae.[Absence Start Date],
DateAdd('m', 1, ae.[Absence Start Date]) -
Day(ae.[Absence Start Date]))) As StartDuration
FROM
[Students] s
INNER JOIN
[Absence Extract] ae ON s[ID] = ae.[Student ID]
GROUP BY s.[Teacher Name],
Year(ae.[Absence Start Date])
MonthName(Month(ae.[Absence Start Date]), TRUE);
结束日期查询
SELECT
s.[Teacher Name] AS [Teacher],
Year(ae.[Absence End Date]) As Year_Absence,
MonthName(Month(ae.[Absence End Date]), TRUE) As Month_Absence,
SUM(DateDiff('d', ae.[Absence End Date],
ae.[Absence End Date] -
(Day(ae.[Absence End Date])-1))) As EndDateDuration
FROM
[Students] s
INNER JOIN
[Absence Extract] ae ON s[ID] = ae.[Student ID]
GROUP BY s.[Teacher Name],
Year(ae.[Absence End Date])
MonthName(Month(ae.[Absence End Date]), TRUE);
加入查询 (长格式)
SELECT s.[Teacher Name],
s.Year_Absence,
s.Month_Absence,
NZ(s.StartDuration) + NZ(e.EndDateDuration) As TotalDuration
FROM startdate_query s
LEFT JOIN enddate_query e
ON s.[Teacher Name] = e.[Teacher Name]
AND s.Year_Absence = e.Year_Absence
AND s.Month_Absence = e.Month_Absence
由于您正在寻找一个包含月份列的广泛报告,以维护缺勤时间的总和,请考虑 MS Access 自己的crosstab query。
交叉表查询 (宽格式)
TRANSFORM SUM(NZ(s.StartDuration) + NZ(e.EndDateDuration)) AS [SumDays]
SELECT s.[Teacher Name],
s.Year_Absence
FROM startdate_query s
LEFT JOIN enddate_query e
ON s.[Teacher Name] = e.[Teacher Name]
AND s.Year_Absence = e.Year_Absence
AND s.Month_Absence = e.Month_Absence
GROUP BY s.[Teacher Name],
s.Year_Absence
PIVOT s.Month_Absence IN ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')
当然,所有这些都未经实际数据的测试。因此,可能需要进行各种调整。