在单个Access查询中直接和加班
我有一个包含作业的时间卡记录的Access表:
JobID HoursWorked Rate 101 1.25 101 0.75 OT 102 0.33 DT 101 0.50 103 2.00
我想要一个查询为每个JobID
返回一个单独的记录,该记录总计了HoursWorked
字段。 如果[Rate] = "OT"
那么HoursWorked
应该乘以1.5,或者在DT的情况下,乘以2。
结果如下所示:
JobID TotalHoursWorked 101 2.875 102 0.66 103 2.00
我想出了这个查询,它成功地提供了不同类型的Rate
:
SELECT JobID, Sum(HoursWorked) AS TotalHoursWorked
FROM Timecards
GROUP BY JobID, Rate;
但我坚持如何乘以不同的费率,并通过JobID返回一个总数。
使用Switch表达式计算每个速率的乘数。 乘以这些值和Sum()
它们全部置于GROUP BY
SELECT
t.JobID,
Sum(t.HoursWorked * Switch(t.Rate='OT',1.5,t.Rate='DT',2,True,1)) AS TotalHoursWorked
FROM Timecards AS t
GROUP BY t.JobID;
在使用Access 2010中的数据进行测试时,该查询返回了您的预期结果。
这是Switch
表达式分解和格式化。 它从表达式评估为True的第一个表达式/值对中返回值,并忽略任何剩余的对。 对于与“OT”或“DT”不匹配的任何比率,最终表达式/值对( True, 1
)返回1:
Switch(
t.Rate='OT', 1.5,
t.Rate='DT', 2,
True, 1
)
您可以使用IIF函数有条件地确定要聚合的内容:
SELECT
JobID,
SUM(IIF(rate = 'OT', HoursWorked * 1.5, IIF(rate = 'DT' ,HoursWorked * 2.0, HoursWorked))) AS TotalHoursWorked
FROM Timecards
GROUP BY JobID;
逻辑是iif(布尔测试,值如果为真,值如果为假)
既然你有两个条件来测试你必须嵌套iif表达式,所以如果rate ='OT'然后乘以1,5,否则检查rate ='DT',如果是这样,则乘以2,或者按照原样使用该值如果比率是别的东西。
另外,当你使用聚合函数时,你不应该按照你聚合的列进行分组。 如果你这样做,你很可能不会得到你想要的结果。
试试这个:
SELECT
JobID,
Sum(HoursWorked * CASE
WHEN rate = 'OT' THEN 1.5
WHEN rate = 'DT' THEN 2
ELSE 1
END
) AS TotalHoursWorked
FROM Timecards
GROUP BY JobID
链接地址: http://www.djcxy.com/p/62069.html