在单个 Access 查询中直接和加班求和
Sum straight and overtime in single Access query
我有一个 Access table 包含工作的考勤卡记录:
JobID HoursWorked Rate
101 1.25
101 0.75 OT
102 0.33 DT
101 0.50
103 2.00
我想要一个查询,其中 return 为每个 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;
但我对如何将不同的费率和 return 单个总数乘以 JobID 感到困惑。
您可以使用 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(boolean test, value if true, value if false)
因为你有两个条件来测试你必须嵌套 iif 表达式所以如果 rate = 'OT' 则乘以 1,5,否则检查 rate = 'DT' 是否乘以使用 2,或者如果 rate 是其他值,则按原样使用该值。
此外,当您使用聚合函数时,您不应按聚合的列进行分组。如果你这样做,你很可能得不到你想要的结果。
试试这个:
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
使用 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
表达式。它 returns 来自第一个 expression/value 对的值,其中表达式的计算结果为 True,并忽略任何剩余的对。最终 expression/value 对 (True, 1
) returns 1 对于任何 Rate 不匹配 'OT' 或 'DT':
Switch(
t.Rate='OT', 1.5,
t.Rate='DT', 2,
True, 1
)
我有一个 Access table 包含工作的考勤卡记录:
JobID HoursWorked Rate 101 1.25 101 0.75 OT 102 0.33 DT 101 0.50 103 2.00
我想要一个查询,其中 return 为每个 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;
但我对如何将不同的费率和 return 单个总数乘以 JobID 感到困惑。
您可以使用 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(boolean test, value if true, value if false)
因为你有两个条件来测试你必须嵌套 iif 表达式所以如果 rate = 'OT' 则乘以 1,5,否则检查 rate = 'DT' 是否乘以使用 2,或者如果 rate 是其他值,则按原样使用该值。
此外,当您使用聚合函数时,您不应按聚合的列进行分组。如果你这样做,你很可能得不到你想要的结果。
试试这个:
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
使用 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
表达式。它 returns 来自第一个 expression/value 对的值,其中表达式的计算结果为 True,并忽略任何剩余的对。最终 expression/value 对 (True, 1
) returns 1 对于任何 Rate 不匹配 'OT' 或 'DT':
Switch(
t.Rate='OT', 1.5,
t.Rate='DT', 2,
True, 1
)