单个Access查询中的直接和超时总和

时间:2015-04-27 21:24:39

标签: sql ms-access ms-access-2013 jet

我有一个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返回一个总数。

3 个答案:

答案 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