在单个 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
    )