2011-05-09 189 views
0

我需要找到該特定客戶的最大日期,這將被視爲最新日期(或當前日期)。然後,從那裏我需要回去52周到27周,並計算總和(小時)。和26周至最近日期(或當前日期)並計算總和(小時)。計算每週基數的小時數?

ClientID StoreID period  hours 
    1  10  2010-04-19 8.04 
    1  10  2010-04-20 6.24 
    1  10  2010-04-21 8.26 
    1  20  2010-04-22 7.94 
    1  20  2010-04-23 22.43 
    1  20  2010-04-24 22.99 
    2  5  2010-12-19 130.67 
    2  5  2010-12-26 159.26 
    2  5  2011-01-02 113.59 
    2  5  2011-01-09 12.66 
    2  8  2011-01-16 22.34 
    2  8  2011-01-23 11.35 

請讓我知道如何在SQL中計算以獲得輸出?如果你有問題問我。

+2

你有什麼試過的?到目前爲止,你有什麼?你在尋找一個概念「如何實現這個」或實際的代碼? – 2011-05-09 14:21:08

+0

我正在查找代碼。 – James123 2011-05-09 14:34:05

+0

好的,根據你提供的樣本數據,你會得到什麼輸出? – 2011-05-09 14:37:45

回答

2

爲此僅使用兩個查詢是最簡單的;第一個獲得邊界日期,第二個計算總數。你可以把它全部轉換成一個查詢,但我認爲它不會有很大的不同。

DECLARE 
    @BeginDate datetime, 
    @MidDate datetime 

SELECT 
    @BeginDate = DATEADD(wk, -52, MAX(period)), 
    @MidDate = DATEADD(wk, -25, MAX(period)) 
FROM TableName 
WHERE ClientID = @ClientID 

SELECT 
    SUM(CASE 
      WHEN period >= @BeginDate AND period < @MidDate THEN hours 
      ELSE 0 
     END) AS HoursInFirstHalf, 
    SUM(CASE 
      WHEN period >= @MidDate THEN hours 
      ELSE 0 
     END) AS HoursInLastHalf 
FROM TableName 
WHERE ClientID = @ClientID 
+0

我可能是錯的,但從我讀過的問題來看,OP很可能會爲每個客戶都要這樣做。否則,我認爲你的方法非常整齊。 (只有它應該是'27'而不是'25')。我可能會將第一個SELECT轉換爲一個將被連接回原始表的子查詢。 – 2011-05-09 21:01:03

+0

@Andriy:問題說*「對於那個特定的客戶」*。這與「爲每個客戶」完全相反。如果這就是OP的真正含義,那麼他錯誤地說明了這個問題。你對周計數也不正確。 OP從* begin *日起27周,這是從* end *日期減去25周,這是相同的事情。最後,正如我所說的,你可以用一個子查詢將其轉換爲一個查詢,但是我認爲這樣做沒有好處,它只會使查詢的可讀性降低(也許如果這是一個內聯TVF,它將會很重要)。 – Aaronaught 2011-05-09 21:23:17

+0

在我看來,使用CTE不會降低腳本的可讀性,儘管我知道我們無法確定OP的服務器版本是否爲2005或更高版本。無論如何,我只是在修改解決方案以便爲所有客戶端返回數據的情況下轉變爲子選擇。如果你留在單一客戶端解決方案中,那麼我同意,將第一個選擇轉換爲子查詢沒有太大的收穫。 – 2011-05-09 22:43:51