2013-03-25 102 views
1

我試圖在SQL Server中彙總2013財年的7天數據(開始日期爲10/1/2012,結束於2013年9月30日),但至今還沒有運氣。有人可以請看看。以下是我的示例數據。如何在SQL中彙總7天

DATE  BREAD MILK  
10/1/12 1  3 
10/2/12 2  4 
10/3/12 2  3 
10/4/12 0  4 
10/5/12 4  0 
10/6/12 2  1 
10/7/12 1  3 
10/8/12 2  4 
10/9/12 2  3 
10/10/12 0  4 
10/11/12 4  0 
10/12/12 2  1 
10/13/12 2  1 

所以,我期望的輸出會是這樣:

DATE  BREAD MILK 
10/1/12 1  3 
10/2/12 2  4 
10/3/12 2  3 
10/4/12 0  4 
10/5/12 4  0 
10/6/12 2  1 
Total  11  15 
10/7/12 1  3 
10/8/12 2  4 
10/9/12 2  3 
10/10/12 0  4 
10/11/12 4  0 
10/12/12 2  1 
10/13/12 2  1 
Total  13  16 

--------through 9/30/2013 

請注意,自2013財年開始於2012年10月1日和2012年9月30日結束,2013財年的第一週6天而不是7天。

我正在使用SQL Server 2008.

+1

只需創建一個'week'列,並使用窗口函數來總結'bread'和'奶''按星期'劃分'。 – 2013-03-25 16:15:49

+0

你是否有一個包含財務日期信息的日曆表?這應該有所需的「周」欄,這應該使其餘的微不足道。 – 2013-03-25 16:38:38

+0

不,我不。謝謝 – joe 2013-03-26 11:09:05

回答

0

您可以通過每週的日期值添加一個新的計算列將它們分組,總結其他列,這樣的事情:

SELECT DATEPART(ww, DATEADD(d,-2,[DATE])) AS WEEK_NO, 
     SUM(Bread) AS Bread_Total, SUM(Milk) as Milk_Total 
FROM YOUR_TABLE 
GROUP BY DATEPART(ww, DATEADD(d,-2,[DATE])) 

注意:我用DATEADD和減去2天設定週一到週一的第一天根據你的日期。如果需要,您可以修改它。

0

您正在尋找彙總。在這種情況下,您至少需要再添加一列才能進行彙總,最簡單的方法就是添加計算列,並按日期分組。

乘坐lookg在:Summarizing Data Using ROLLUP

0

這裏是它如何能夠做到的總體思路:

你需要一個派生列的每一行,以確定哪些財政本週記錄屬於。一般來說,您可以從10/1中減去該記錄的日期,獲取已過去的天數,再除以7,然後確定結果。

然後你可以將GROUP BY派生列並使用SUM聚合函數。

最大的摺痕是,你開始的6天。您可能需要添加一些邏輯,以確保星期幾從星期天開始或在您使用的任何一天,但這應該讓您開始。

0

上面的WITH ROLLUP建議可以幫助;您需要保存數據並根據需要進行轉換。

你需要做的最重要的事情就是正確識別你的周。如果您沒有將這些內容加載到表格中,以便您可以識別它們,則可以即時構建它們。下面是其中一種做法:

CREATE TABLE #fy (fyear int, fstart datetime, fend datetime); 
CREATE TABLE #fylist(fyyear int, fydate DATETIME, fyweek int); 

INSERT INTO #fy 
SELECT 2012, '2011-10-01', '2012-09-30' 
UNION ALL 
SELECT 2013, '2012-10-01', '2013-09-30'; 

INSERT INTO #fylist 
     (fyyear, fydate) 

SELECT fyear, DATEADD(DAY, Number, DATEADD(DAY, -1, fy.fstart)) AS fydate 
FROM Common.NUMBERS 
CROSS APPLY (SELECT * FROM #fy WHERE fyear = 2013) fy 
WHERE fy.fend >= DATEADD(DAY, Number, DATEADD(DAY, -1, fy.fstart)); 

WITH weekcalc AS 
(
    SELECT DISTINCT DATEPART(YEAR, fydate) yr, DATEPART(week, fydate) dt 
    FROM #fylist 

), 
    ridcalc AS 
(
    SELECT 
    ROW_NUMBER() OVER (ORDER BY yr, dt) AS rid, yr, dt 
    FROM weekcalc 
) 

UPDATE #fylist 
SET fyweek = rid 
FROM #fylist 
JOIN ridcalc 
    ON DATEPART(YEAR, fydate) = yr 
    AND DATEPART(week, fydate) = dt; 



SELECT list.fyyear, list.fyweek, p.[date], COUNT(bread) AS Bread, COUNT(Milk) AS Milk 
FROM products p 
JOIN #fylist list 
    ON p.[date] = list.fydate 
GROUP BY list.fyyear, list.fyweek, p.[date] WITH ROLLUP; 

以上Common.Numbers參考的是,我用這樣的事情(從1到1M)一個簡單的數字表。您也可以根據需要即時創建它。

2

使用選項與GROUP BY ROLLUP操作

SELECT CASE WHEN DATE IS NULL THEN 'Total' ELSE CONVERT(nvarchar(10), DATE, 101) END AS DATE, 
     SUM(BREAD) AS BREAD, SUM(MILK) AS MILK 
FROM dbo.test54 
GROUP BY ROLLUP(DATE),(DATENAME(week, DATE)) 

演示上SQLFiddle

結果:

DATE  BREAD MILK 
10/01/2012 1  3 
10/02/2012 2  4 
10/03/2012 2  3 
10/04/2012 0  4 
10/05/2012 4  0 
10/06/2012 2  1 
Total  11  15 
10/07/2012 1  3 
10/08/2012 4  7 
10/10/2012 0  4 
10/11/2012 4  0 
10/12/2012 2  1 
10/13/2012 2  1 
Total  13  16 
+0

非常感謝,也感謝其他的溫柔。它完美的作品。再次感謝。 – joe 2013-03-26 11:10:15

+0

@joe FYI,如果您的數據在某些年份(例如2012,2013等),那麼您需要此GROUP BY子句:GROUP BY ROLLUP(DATE),(DATENAME(year,DATE)),(DATENAME(week,日期)) – 2013-03-26 11:40:24