2016-05-06 106 views
1

我試圖從SQL Server中的表中進行選擇,以便它將我的FinalDate列分組爲週數,並在下一個單元格中彙總該周的ThisApp列。我在網上看,我似乎無法找到我所追求的。按週數分組,包括空周和總計其他列

我想知道這是我在T-SQL中可以做到的嗎?

這些目前都在我的表中的行:

FinalDate ThisApp 
    ------------------------ 
    15/04/2016 20459.92 
    29/05/2016 7521.89 
    30/05/2016 5963.61 
    31/05/2016 3293.72 
    03/06/2016 27413.20 
    04/06/2016 8392.16 
    05/06/2016 7789.46 
    05/06/2016 11414.73 
    10/06/2016 48893.46 
    11/06/2016 14685.47 
    11/06/2016 7030.03 

我想更換FinalDate柱,週數,總結了This App每個週數。

另外:

我需要它來顯示連續週數,所以我不希望它跳過任何星期,因此,例如:

FinalDate ThisApp 
    ------------------------ 
    01/01/2016 10.00 -- (Would be week 1) 
    02/01/2016 10.00 -- (Would be week 1) 
    15/01/2016 10.00 -- (Would be week 3) 

將顯示,如:

FinalDate ThisApp 
    ------------------------ 
    1   20.00 
    2   0.00 --This would show as 0.00 because there was no week 2. 
    3   10.00 

我明白這是一個非常具體的請求,這就是爲什麼我想知道如果我可以在SQL中做到這一點。

+0

一個好的技巧是在這裏發佈日期時,爲了避免混淆使用MM/DD/YYYY。大多數人會採用這種格式,當你使用DD/MM/YYYY時,除非包括否則不可能的東西(比如'15/01/2016'),否則會引起混淆。 –

回答

1
DECLARE @tmp table(dat datetime, 
        val float) 

insert into @tmp 
values ('15/04/2016' , 20459.92), 
     ('29/05/2016', 7521.89), 
     ('30/05/2016', 5963.61), 
     ('31/05/2016', 3293.72), 
     ('03/06/2016', 27413.20), 
     ('04/06/2016', 8392.16), 
     ('05/06/2016', 7789.46), 
     ('05/06/2016', 11414.73), 
     ('10/06/2016', 48893.46), 
     ('11/06/2016', 14685.47), 
     ('11/06/2016', 7030.03) 

SELECT Weeknumb, 
     ISNULL(sumvals,0) as weekval 
FROM 
    (SELECT DATEPART(ISOWK,DATEADD(wk,t2.number,'2016')) as Weeknumb 
    FROM master..spt_values t2 
    WHERE t2.type = 'P' 
    AND t2.number <= 255 
    AND YEAR(DATEADD(wk,t2.number,'2016'))=2016)allWeeks 
    LEFT JOIN 
    (SELECT sum(val) as sumvals, 
      datepart(ISOWK,dat) as weeks 
    FROM @tmp 
    GROUP BY datepart(ISOWK,dat)) actualData 
    ON weeks = Weeknumb 
    ORDER BY Weeknumb asc 

你去那裏。 2016年的所有星期和您的價值總和

+0

此查詢僅適用於特定年份(在本例中爲2016年)。 –

1
SELECT DATEPART(WEEK, FinalDate) FinalDate 
,  SUM(ThisApp) ThisApp 
FROM  Your_Table 
GROUP BY DATEPART(WEEK, FinalDate) 

爲了得到0數週沒有,你必須創建一個表weeknumbers(1-52)和right join它的數據集存在。在這種情況下,你會得到這樣的:

SELECT  wk.Number 
,    ISNULL(SUM(ThisApp), 0) 
FROM   Your_Table T 
RIGHT JOIN WeekNumbers wk 
      ON wk.Number = DATEPART(WEEK, T.FinalDate) 
GROUP BY  wk.Number 
+0

有趣,我會試試這個,讚賞。 –

+0

我可能不得不在週一試試這個,因爲我必須在幾分鐘內離開週末,如果它適合我​​,我會在週一接受你的回答。 –

+0

祝你好運,祝你週末愉快 – HoneyBadger

0

HoneyBadger的答案很好,但它會將每年的第1周的價值組合在一起(所以1975年1月1日將與2016年1月1日分組)。爲了避免這種情況,您需要將年份添加到分組中。

另外,正如他指出的那樣,如果您希望返回NULL周,您還需要一個單獨的表格。但是,你應該製作一個日曆表(Google這個 - 它們很簡單並被廣泛使用),並且你不應該在1-52周內製作一個表格。

最後,爲了確保您不會得到在所有年/周前返回0的記錄,這些記錄在數據之前或之後都會返回,您將需要添加開始日期和結束日期參數。您可以接受它們,也可以將它們設置爲Your_Table中的第一個和最後一個FinalDate。

這裏是你應該使用什麼:

DECLARE @StartDate date = (SELECT MIN(FinalDate) FROM Your_Table), 
     @EndDate date = (SELECT MAX(FinalDate) FROM Your_Table) 

SELECT YEAR(C.BaseDate) AS [Year], 
     DATEPART(WEEK, C.BaseDate) AS [Week], 
     ISNULL(SUM(YT.ThisApp), 0) AS [This App Total] 
FROM  Calendar C 
LEFT OUTER JOIN Your_Table YT 
    ON C.BaseDate = CAST(YT.FinalDate AS DATE) 
WHERE C.BaseDate BETWEEN @StartDate AND @EndDate 
GROUP BY YEAR(C.BaseDate), 
     DATEPART(WEEK, C.BaseDate)