2014-05-10 173 views
2

通過使用下面的鏈接我試圖做一個每週查詢。我的星期從星期四開始,持續到星期三,我正確地改變了,但是(Field1)的總和沒有出現。我做錯了什麼?每週數據SQL查詢星期四到星期三

Query for weekly report

SELECT 
    DATEADD(WEEK, DATEDIFF(WEEK, '19000104', START_DATETIME), '19000104') AS EveryThrusday, 
    DATEADD(WEEK, DATEDIFF(WEEK, '19000104', START_DATETIME)+1, '19000104') - 1 AS EveryWednesday, 
    SUM(Field1) 
FROM 
    Table1 
GROUP BY 
    DATEADD(WEEK, DATEDIFF(WEEK, '19000104', START_DATETIME), '19000104'), 
    DATEADD(WEEK, DATEDIFF(WEEK, '19000104', START_DATETIME)+1, '19000104')-1 
ORDER BY 
    DATEADD(WEEK, DATEDIFF(WEEK, '19000104', START_DATETIME), '19000104'), 
    DATEADD(WEEK, DATEDIFF(WEEK, '19000104', START_DATETIME)+1, '19000104')-1 

Table 1

Date  field1 
1-May-14 102948.66 
2-May-14 102927.21 
3-May-14 102925.89 
4-May-14 102427.55 
5-May-14 101551.95 
6-May-14 102952.12 
7-May-14 102947.53 

總共= 718680.93

Table 2

Start date End date field1 
1-May-14 7-May-14 719793.72 

在第一個表中,我從5月1日星期四到5月7日每天檢索數據。那些日子的總和爲718680.93

但是,如果我跑每週查詢看到值是字段1表2不同

+0

如果你只是說'按字段1'分組怎麼辦? – Rahul

+0

感謝您的回覆。其實我需要添加更多的領域...像接近10.它會對我有用嗎? – user3077053

+0

你能描述一下你想要這個查詢嗎? Table1的佈局是什麼?我的第一個傾向將是在子查詢/內聯視圖中選擇您的DATEADD值,然後執行分組。 –

回答

0

你可以很容易地看到爲什麼總和望着DATEADD(WEEK, DATEDIFF(WEEK, '19000104', START_DATETIME), '19000104')的結果與正確值不同每個日期在你的範圍內。下面的查詢:

SELECT 
    START_DATETIME, 
    Thursday = DATEADD(WEEK, DATEDIFF(WEEK, '19000104', START_DATETIME), '19000104') 
FROM dbo.Table1; 

會給你這樣的結果:

START_DATETIME Thursday 
-------------- ---------- 
2014-05-01  2014-05-01 
2014-05-02  2014-05-01 
2014-05-03  2014-05-01 
2014-05-04  2014-05-08 
2014-05-05  2014-05-08 
2014-05-06  2014-05-08 
2014-05-07  2014-05-08 

正如你所看到的,你的表情不會爲上週四開始在同一個星期內的所有日期返回相同的結果。因此,您的查詢將對不同的日期進行分組,這反過來又是您獲得不正確結果的原因。

請注意,表達式將返回相同的日期不一致,無論DATEFIRST設置的,因爲DATEDIFFdoes not respect that setting始終計算的結果,如果DATEFIRST設置爲7

要解決這個問題,你可以更換DATEDIFF(WEEK)通過DATEDIFF(DAY)/7

DATEADD(WEEK, DATEDIFF(DAY, '19000104', START_DATETIME)/7, '19000104') 

由於兩個操作數是整數時,SQL Server將執行整數分頻和它的結果,日因此,將是一個整體(在這種情況下是正確的)週數。

或者,您可以通過從日期減去工作日數計算本週初:

DATEADD(DAY, 1 - DATEPART(WEEKDAY, START_DATETIME), START_DATETIME) 

同樣,週末將使用7 - DATEPART(...)。以上假設DATEFIRST設置爲4(即星期四)。如果在您的環境中不同,則需要相應地調整DATEADD的第二個參數。

+0

Hello Guru Andriy M,非常感謝您的解決方案對我真的很有用,非常感謝您的好意。 – user3077053

相關問題