我有一个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
我想出了这个成功SUMS不同类型的Rate
:
SELECT JobID, Sum(HoursWorked) AS TotalHoursWorked
FROM Timecards
GROUP BY JobID, Rate;
但是我坚持如何将不同的费率相乘并按JobID返回一个总数。
答案 0 :(得分:4)
使用Switch表达式计算每个 Rate 的乘数。将这些值与 HoursWorked 相乘,并在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'的 Rate ,最终表达式/值对(True, 1
)返回1 :
Switch(
t.Rate='OT', 1.5,
t.Rate='DT', 2,
True, 1
)
答案 1 :(得分:2)
您可以使用IIF function来有条件地确定汇总内容:
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,或者如果rate是其他的话,则使用该值。
此外,当您使用聚合函数时,不应按聚合的列进行分组。如果你这样做,很可能无法得到你想要的结果。
答案 2 :(得分:-1)
试试这个:
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