我有一个 Access 数据库,它跟踪每个员工在每个支付期间使用的小时数。
我需要一个查询,让我能够及时回顾过去 25 个支付期的总数,这是根据每个员工的前 26 个支付期的每一个计算得出的。这是一个滚动总计,本质上,必须逐行忽略 26 个(或更多)支付期的记录。我有 5 年的记录,很遗憾有必要保留所有记录,并且能够查看每个员工的 26 个支付期的运行总计是多少以及在特定的支付期限。
基本上,我们正在查看每个员工总共51条记录——查询实际显示的第一个支付期是26 个支付期之前;它的运行总数基于该支付期内发生的情况加上前 25 次。
表:
HoursID、EmployeeID、PayPeriodID、HoursUsed
PayPeriodID、PayPeriodEndDate
查询结果(已经工作):
EmployeeID,TotalOfHoursUsedLast26PP(此查询请求一个日期倒计时)
我需要的查询结果:
EmployeeID、PayPeriodID、HoursUsed、[使用的总小时数,基于紧接在此 PP 之前的 25 个 PP ]
我一直在搞乱 DSum,但我不知道如何让它只计算最后 26 个 PP,计算我需要的 PP,一次为一名员工,每个工资期分别计算。
明确一点:我需要能够在 2009 年或其他时间回顾并运行此查询以获取 26 个支付期;在 Excel 中,对于一位员工,我们做了如下所示的操作:
Line32_HoursUsedLast26PP = Line32_HoursUsedThisPP + Line31_HoursUsedLast26PP - Line4_HoursUsedThisPP
结果类似于:
2011-5 - 338.8
2011-6 - 398.5 2011-7
- 428.7
2011-8 - 442.5
2011-9 - 451 2011-10
- 451
2011-11 - 451
2011-12 - 451
2011-13 - 451
2011-1
2011-15 - 451
2011-16 - 452.4
2011-17 - 453.1 2011-18
- 454.3
2011-19 - 454.3 2011-20
- 455
2011-21 - 456.1
2011-22 - 460.2
848 2011-23 -
411
2011-25 - 480
2011-26 - 480 2012-01
- 453.2
2012-02 - 381.2
2012-03 - 301.2
2012-04 - 221.2
2012-05 - 141.2
2012-06 - 81.5
2012-07 - 51.3
2012-08 - 37.5
2012-09 - 29
2012-10 - 29
2012-11 - 29
2012-12 - 29
2012-13 - 29
2012-14 - 29
2012-15 - 29
2012-16 - 27.
2012-17 - 26.9
2012-18 - 25.7
2012-19 - 25.7
2012-20 - 25
2012-21 - 23.9
2012-22 - 19.8
2012-23 - 0
如您所见,运行总数上升和下降。
这是我用于“查找过去 26 个支付周期的总小时数”查询的实际代码;关于认证等的东西,是因为在任何给定的支付期间,员工可能会在多个认证下记录小时数。
SELECT List_Employees.ID, Sum(Items_Hours_Actually_Taken.HoursActual) AS SumOfHoursActual
FROM (List_Pay_Periods INNER JOIN (List_Employees INNER JOIN (Items_Certifications INNER JOIN Items_Hours_Actually_Taken ON Items_Certifications.[CertificationID] = Items_Hours_Actually_Taken.[HoursActualCertificationID]) ON List_Employees.ID = Items_Certifications.[CertificationEmployeeID]) ON List_Pay_Periods.[PayPeriodID] = Items_Hours_Actually_Taken.[HoursActualPayPeriod]) INNER JOIN Last_26_PP_From_Today ON List_Pay_Periods.PayPeriodID = Last_26_PP_From_Today.PayPeriodID
GROUP BY List_Employees.ID;
如果不清楚,此查询依赖于名为 Last_26_PP_From_Today 的单独查询:
SELECT List_Pay_Periods.PayPeriodID, List_Pay_Periods.PPEnd
FROM List_Pay_Periods
WHERE (((List_Pay_Periods.PPEnd)<Date() And (List_Pay_Periods.PPEnd)>(Date()-14)));
我还有一个查询,可以切换到从任何特定日期查找最后 26 个支付期:
PARAMETERS [Date] DateTime;
SELECT List_Pay_Periods.PayPeriodID, List_Pay_Periods.PPEnd
FROM List_Pay_Periods
WHERE (((List_Pay_Periods.PPEnd)<[Date] And (List_Pay_Periods.PPEnd)>([Date]-14)));
我在绝望中想到的蛮力方法涉及一系列级联的 Make Table 查询,那时我决定也许这里有人可以提供更清洁的东西。
更新
多亏了 Gord,我现在一切正常,除了我没有看到支付周期数字:
SELECT hbep1.Employee, hbep1.PP
(
SELECT Sum(hbep2.Hours)
FROM Hours_By_Employee_Per_PP AS hbep2
WHERE hbep2.Employee=hbep1.Employee
AND (hbep2.PP Between hbep1.[PP]-25 And hbep1.[PP])
) AS SumLast26
FROM Hours_By_Employee_Per_PP AS hbep1;
这让我:
Employee SumLast26
2 12
2 12
2 12
2 18
2 91
3 4
3 8
3 88
3 168
3 180
5 15
5 15
5 15
7 43
7 61
7 75
7 97
7 106
7 121
9 19
9 0