我有一个Access数据库,它跟踪每个员工在每个支付期间使用的小时数。
我需要一个查询,以便我能够及时回顾并查看仅过去25个付款期的总计,从每个计算得出之前的26个工资期,为每位员工。这是一个滚动总数,其中基本上,每个行的26个支付期(或更长)的记录必须被忽略。我有五年的记录,遗憾的是必须将它们全部保留下来,能够看到每个员工的26个工资期限总计是多少,以及特定的工资期。
基本上,我们会查看每位员工的 51 记录总数 - 查询实际显示的第一个付款期,但 26 支付期前;根据该支付期间发生的情况加上之前的25个,它有一个总计。
表格
HoursID , EmployeeID , PayPeriodID ,使用时间
PayPeriodID , PayPeriodEndDate
查询结果(已工作):
EmployeeID , TotalOfHoursUsedLast26PP (此查询请求计算日期)
我需要的查询结果:
EmployeeID , PayPeriodID ,使用时间,[使用的总小时数,基于此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-14 - 451
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
2011-23 - 480
2011-24 - 480
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.6
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查询,当我决定在这里有人可能提供更清洁的东西时。
更新
感谢戈德,我现在一切正常,除了我没有看到付款期数:
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
答案 0 :(得分:0)
我希望这能指出你正确的方向:
我从一个名为[Hours_by_Empl_PP]的表开始,该表具有每个Pay_Period中每个Employee的总小时数。
EmployeeID PayPeriodID HoursUsed
1 1 3
1 2 7
1 3 4
1 4 4
1 5 5
1 6 8
1 7 5
2 1 1
2 2 2
2 3 1
2 4 0
2 5 0
2 6 1
2 7 2
如果您的表数据具有给定(Employee + Pay_Period)的多个记录,您可以创建一个简单的聚合查询来累计值......
SELECT EmployeeID, PayPeriodID, SUM(HoursUsedToday) AS HoursUsed
FROM YourRawData
GROUP BY EmployeeID, PayPeriodID
...将 保存为[Hours_by_Empl_PP],并使用它代替表格。
下一步是创建一个查询来总结4个周期窗口的小时数。 (我选择4而不是26只是为了更容易检查我的工作。)此窗口包括当前的Pay_Period和前三个。
SELECT hbep1.EmployeeID, hbep1.PayPeriodID,
(
SELECT Sum(hbep2.HoursUsed)
FROM Hours_by_Empl_PP hbep2
WHERE hbep2.EmployeeID=hbep1.EmployeeID
AND (hbep2.PayPeriodID Between hbep1.[PayPeriodID]-3 And hbep1.[PayPeriodID])
) AS Sum_of_Hours_last_4_PPs
FROM Hours_by_Empl_PP hbep1;
这个查询给了我
EmployeeID PayPeriodID Sum_of_Hours_last_4_PPs
1 1 3
1 2 10
1 3 14
1 4 18
1 5 20
1 6 21
1 7 22
2 1 1
2 2 3
2 3 4
2 4 4
2 5 3
2 6 2
2 7 3
请注意,查询假定PayPeriodID值是按时间顺序排列的。您可以使用[PayPeriodEndDate]值获得相同的结果,但这意味着另一个JOIN,我希望尽可能保持示例。
就是这样,真的。您可以使用[Hours_by_Empl_4PP_window]之类的名称保存该查询,并在查询中将其用于其他表上的JOIN(对于员工姓名等)并从那里获取。