2011-11-15 79 views
1

我有3列的表格:ID, AmountCollected, Date。我需要構建一個存儲過程來返回像這樣的數據。處理一個月,和SQL Server 2008中

Month--CollectionSum 
Jan2011|500 
Feb2011|549 
Mar2011|678 
............ 
2011年1月的

收藏總和應該是AmountCollected的總和與Jan2011的日期或之前,同樣Feb2011的收藏總和應該是AmountCollected的總和與Feb2011的日期或之前等等....

你能幫我解決這個問題嗎?我需要建立SQL Server上查詢2008年

回答

0

這裏就是你可以修改,以適應您的需求的例子:

http://www.sqlservercentral.com/Forums/Topic460765-338-1.aspx

的關鍵運行總計是創建連接表的聲明在日期上分組的表達式。但不是說table.date = groupeddata.date,你說table.date < = groupeddata.date爲了拿起不僅僅是當前的日期,但所有以前的日期。無論如何,當你閱讀鏈接中的答案時,它會更有意義。

+0

注意,他的作用: 內連接RunningCTE ST上s.YYYY = sr.YYYY和s.YYYYMM> = sr.YYYYMM 這意味着總將每月超過累積的,但然後每年重新開始。因此,如果您的總計不會從每年開始,那麼您可能需要對其進行調整。 –

+0

感謝布蘭登,我已經達成了解決方案,但即使如此,我也去了你提到的例子,它增加了我的知識。感謝幫助的人!願你在職業生涯中取得很多成功! –

1
WITH T AS (
    SELECT SUM(AmountCollected) AS SubTotal, YEAR([Date]) AS Y, MONTH([Date]) AS M, 
    ROW_NUMBER() OVER (ORDER BY YEAR([Date]), MONTH([Date])) AS OrderID 
    FROM TestTable 
    GROUP BY YEAR([Date]), MONTH([Date]) 
) 
SELECT Y, M, SubTotal, 
(SELECT SUM(T.SubTotal) FROM T WHERE OrderID <= A.OrderID) AS RunningTotal 
FROM T AS A 
ORDER BY Y, M 

這裏是不使用子查詢的另一個版本,這應該讓它更快一點:

WITH T AS (
    SELECT SUM(AmountCollected) AS SubTotal, YEAR([Date]) AS Y, MONTH([Date]) AS M, 
    ROW_NUMBER() OVER (ORDER BY YEAR([Date]), MONTH([Date])) AS OrderID 
    FROM TestTable 
    GROUP BY YEAR([Date]), MONTH([Date]) 
) 
SELECT A.Y, A.M, A.SubTotal, A.SubTotal + ISNULL(B.SubTotal, 0) AS RunningTotal 
FROM T AS A 
LEFT JOIN T AS B ON A.OrderID = B.OrderID + 1 
ORDER BY A.Y, A.M 

RunninigTotal場增加了當前行的SubTotal與以前行的SubTotal。通過不使用另一個SUM來計算RunningTotal,您可以通過避免每行必須添加所有先前行的值來提高速度。

+0

謝謝Robo。我首先嚐試了你的查詢,它的工作:) –

+0

謝謝Robo。我首先嚐試了你的查詢,它的工作:) –

+0

很高興幫助。 :-)你可以接受答案,所以這個問題顯示爲已回答。 – Robo

0

首先創建定期monthwise和表格。使用條件將此表的兩個實例連接起來,以匹配第一個表的每一行與其他表中包含本次和所有前幾個月的數量的行。最後由幾個月組成。在該鏈接

with SumTbl (YrMon, SumAmt) as 
(
    select Year(dte)*100+Month(dte), sum(amount) 
    from Tbl 
    group by Year(dte)*100+Month(dte) 
) 
select t1.YrMon, sum (t2.SumAmt) as CumAmt 
from SumTb1 t1, SumTbl t2 
where t2.YrMon <= t1.YrMon 
group by t1.YrMon 
order by t1.YrMon;