2015-04-27 61 views
1

我有一個包含考勤記錄工作Access表:琛直和加班單Access查詢

JobID HoursWorked Rate 
101 1.25 
101 0.75   OT 
102 0.33   DT 
101 0.50 
103 2.00 

我想返回單個記錄已經總結出了HoursWorked場中的每個JobID查詢。如果[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; 

但我被困在如何乘以不同的費率,並通過作業ID返回單個總。

回答

4

使用Switch表達式計算乘數爲每。乘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的第一個表達式/值對中返回值,並忽略任何剩餘的對。最終的表達/值對(True, 1)對於任何速率不匹配則返回1 'OT''DT'

Switch(
     t.Rate='OT', 1.5, 
     t.Rate='DT', 2, 
     True, 1 
    ) 
+0

看起來比我嵌套的iifs更好:)我不使用Access足以記住我猜的更精細的點。 – jpw

+2

'Switch'沒有得到足夠的重視。我認爲你的嵌套'IIf'邏輯是正確的,所以我upvoted。但是,對我而言,'Switch'更易於理解和管理。請參閱[Access SQL中Select Case的等效選項?](http://stackoverflow.com/a/15776608/77335)中的另一個示例。 – HansUp

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是別的。

此外,當您使用您不應該組聚合函數的列()你聚集。如果你這樣做,你很可能不會得到你想要的結果。

-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 
+2

微軟Access不支持CASE表達式... – jpw

+0

哦...我的壞,我看到SQL標記和語法是純SQL :) –

+0

我認爲是這樣。對於任何其他數據庫來說,答案都是正確的,而不是愚蠢的訪問... – jpw