2015-02-05 25 views
0

我有一個SQL查詢計算兩個總和的報價。此報價應按周計算。因此使用Datepart('ww', Date, 2, 2)來獲取日曆周。查詢按日曆周分組/問題:日期擴展超過一年

這個查詢在2014年工作正常,但現在我面臨一個問題。

該用戶的動產與和日期的形式日期選取器,然後在where子句中使用,只選擇相關記錄。

如果他們選擇了從過去的一年中(例如2014)日期和最新從今年我的查詢顯示irrelvant數據,因爲它不cosinder今年剛剛日曆周。

那麼,如何通過日曆周組,只選擇從正確的年份記錄。

SELECT DatePart('ww',Date,2,2) AS WEEK, 
    Year(Workload_Date) AS [YEAR], 
    (SUM(Value1)+SUM(Value2))AS [Total1], 
    (SUM(Value3)+SUM(Value4)) AS [Total2], 
    ((SUM(Value1)+SUM(Value2))/(SUM(Value3)+SUM(Value4))) AS [Quote] 
FROM tbl 
WHERE DatePart('ww',Date,2,2) Between DatePart('ww',FromDatePickerField,2,2) And DatePart('ww',ToDatePickerField,2,2) 
GROUP BY DatePart('ww',Date,2,2), Year(Date) 
ORDER BY Year(Date), DatePart('ww',Date,2,2); 

該表格每天包含一條記錄。

Date  | Value1 | Value2 | Value3 | Value4 | 
01.01.2014 | 4  | 3  | 2  | 3  | 
02.01.2014 | 4  | 3  | 9  | 3  | 
03.01.2014 | 4  | 3  | 4  | 1  | 
04.01.2014 | 4  | 3  | 1  | 3  | 
... 
01.01.2015 | 4  | 3  | 6  | 3  | 
02.01.2015 | 4  | 3  | 3  | 7  | 

回答

1

你可以你的基礎上的邏輯Week_Ending_date而不是週數和年份,這樣你可彙總每週你的數據,讓SQL處理周/年的檢測邏輯。

櫃面,你必須跨越2年的日期範圍,即使再計算將基於對week_ending_date和應能正常工作了。

喜歡的東西...

SELECT DATEADD(dd, 7-(DATEPART(dw, DATE)), DATE) AS WEEK_ENDING_DATE 
     ,Year(DATEADD(dd, 7-(DATEPART(dw, DATE)), DATE)) AS [YEAR] 
     ,(SUM(Value1) + SUM(Value2)) AS [Total1] 
     ,(SUM(Value3) + SUM(Value4)) AS [Total2] 
     ,((SUM(Value1) + SUM(Value2))/(SUM(Value3) + SUM(Value4))) AS [Quote] 
    FROM tbl 
    WHERE DATEADD(dd, 7-(DATEPART(dw, DATE)), DATE) BETWEEN DATEADD(dd, 7-(DATEPART(dw, FromDatePickerField)), FromDatePickerField) 
      AND DATEADD(dd, 7-(DATEPART(dw, ToDatePickerField)), ToDatePickerField) 
and date >= FromDatePickerField 
and date <= ToDatePickerField 
    GROUP BY DATEADD(dd, 7-(DATEPART(dw, DATE)), DATE)  
    ORDER BY DATEADD(dd, 7-(DATEPART(dw, DATE)), DATE) 
+0

感謝您的答覆。我還沒有完全理解這個邏輯。比方說,用戶選擇從星期三開始。此查詢是否會從星期一開始選擇所有記錄?與迄今爲止一樣的東西。用戶再次選擇星期三,將記錄直到星期天被選中? – blckbird 2015-02-05 15:40:27

+1

你說得對。您可以限制這些情況下的數據雖然..嘗試更新的代碼。 – SoulTrain 2015-02-05 15:44:49

+0

在dateadd和datepart中由於'dw'和'dd'出現錯誤。需要將'dw'改爲''w''和'dd'爲''d'' – blckbird 2015-02-05 16:05:23

0

我看到2個可能的解決方案。

1)您在使用窗體上的日期選擇器每當年兩個datepickers的不同停止用戶。也許一個MsgBox什麼的,

2)您更改到的DatePicker到從年。

DECLARE @MinDate DATE = '01.11.2014' 
DECLARE @tmpDate DATE = '12.02.2015' 
DECLARE @MaxDate DATE = (CASE WHEN Year(@MinDate) != Year(@tmpDate) THEN Convert(DATE, '31.12.' + Convert(VARCHAR(4), Year(@MinDate))) ELSE @tmpDate END) 

SELECT @MinDate, @tmpDate, @MaxDate 

結果:

minDate  tmpDate  maxDate 
01.11.2014 12.02.2015 31.12.2014 
+0

如果我做1,仍然有問題。如果從現在開始到2015年,則選擇2014年以來具有相同日曆周的記錄。 – blckbird 2015-02-05 15:42:39

+0

如何將where子句更改爲 'where date> = datepicker1'? – Hockenberry 2015-02-05 15:45:53

+0

比方說,用戶選擇從星期三開始。然後我會錯過星期一和星期二的記錄。迄今爲止,反之亦然。 – blckbird 2015-02-05 15:47:47