2017-03-19 306 views
1

我有一個MS Access表(tbl_SalesData)如下:累積SQL計算

SCOREDATE | USERID |  Sales  | HoursWorked | 
----------------------------------------------------- 
01/03/2017 | 20511 |  20  |  10  | 
02/03/2017 | 20511 |  27  |  9  | 
03/03/2017 | 20511 |  18  |  9  | 
04/03/2017 | 20511 |  20  |  8  | 

我想寫一個SQL查詢,將計算每小時銷售並重的每一天,也爲YTD。

年初至今的計算需要將所有銷售額累計到當天的所有銷售額,對於HoursWorked而言相同,然後將總銷售額除以總工作小時數。所以期望的輸出將是:

SCOREDATE | USERID | Sales/Hour | Sales/Hour YTD | 
-------------------------------------------------------- 
01/03/2017 | 20511 |  2  |  2   | 
02/03/2017 | 20511 |  3  |  2.47  | 
03/03/2017 | 20511 |  2  |  2.32  | 
04/03/2017 | 20511 |  2.5  |  2.36  | 

我真的很努力與這一個。每日銷售/小時是相當簡單的,如下:

SELECT SCOREDATE, USERID, Sales/HoursWorked 
FROM tbl_SalesData 

但不幸的是我似乎無法接近搞清楚YTD部分將如何工作。有人能指點我正確的方向嗎?

回答

3

您可以使用相關子查詢:

select sd.*, 
     (select sum(sd2.sales)/sum(sd2.hours_worked) 
     from tbl_SalesData sd2 
     where sd2.userid = sd.userid and sd2.scoredate <= sd.scoredate 
     ) as running_average_sales 
from tbl_SalesData as sd; 
+0

謝謝你,這很好。我試圖玩弄自我連接,但我沒有想到把子查詢直接放入選擇部分那樣:) – Leroy

0

非常非常感謝戈登·利諾夫他使用相關子查詢偉大的答案。 我也遇到了另一種解決方案,我認爲這可能對發佈這裏有用。它使用自加入而不是子查詢,並且我認爲應該使用大數據集運行得更快一些。

SELECT tbl1.scoreDate, tbl1.UserID, 
tbl1.sales/tbl1.HoursWorked as AvgSales, 
sum(tbl2.Sales)/sum(tbl2.Hoursworked) AS AvgSalesYTD 
FROM tbl_SalesData AS tbl1 INNER JOIN tbl_SalesData AS tbl2 ON tbl1.UserID = tbl2.UserID 
AND tbl1.scoreDate >= tbl2.scoreDate 
GROUP BY tbl1.scoreDate, tbl1.UserID, tbl1.sales/tbl1.HoursWorked