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

上一篇: Sum straight and overtime in single Access query

下一篇: What kind of index for orderby/where query in SQL?