2014-03-01 42 views
2

我有一些客戶財務數據如下所示,無法弄清楚如何顯示每個常規金額的開始和結束貢獻日期支付。我正在使用SQL Server 2008.我的源數據顯示在下面。SQL Server 2008 - 按時間順序計算貢獻金額的最小和最大日期

Cust Contrib_Date Amount 
---- ------------ ------ 
100 2013-01-01 500.00 
100 2013-02-01 500.00 
100 2013-03-02 500.00 
100 2013-04-01 500.00 
100 2013-05-05 600.00 
100 2013-06-06 600.00 
100 2013-07-05 600.00 
100 2013-09-10 500.00 
100 2013-10-10 500.00 
100 2013-11-10 500.00 
100 2013-12-11 500.00 
200 2010-01-01 100.00 
200 2010-02-02 100.00 
200 2010-03-09 300.00 

這是我試圖從輸出得到的。

Cust Start_Date End_Date Amount 
---- ---------- ---------- ------ 
100 2013-01-01 2013-04-01 500.00 
100 2013-05-05 2013-07-05 600.00 
100 2013-09-10 2013-12-11 500.00 
200 2010-01-01 2010-02-02 100.00 
200 2010-03-09 2010-03-09 300.00 

客戶定期對賬戶進行每月供款。這些金額在每個期間保持不變(我們有3個Cust = 100,即第1期500.00已付,第2期600.00,第3期回到500.00),但由於週末的貢獻日期可能會稍微變化幾天,公衆假期等,如上所示。因此,我需要循環查看數據,按時間順序查找每個客戶的每個金額的最小和最大貢獻日期,當我遇到不同金額時,再次啓動該過程。將會有很多客戶需要這樣做。

我用SQL比較好,但不知道如何做到這一點。有沒有人有任何想法?誰能幫忙?我之前使用過遊標,但並不經常。

回答

1

試試這個:

SELECT y.Cust, 
     MIN(y.Contrib_Date) AS FromDate, 
     MAX(y.Contrib_Date) AS ToDate, 
     y.Amount 
FROM (
    SELECT x.Cust, x.Contrib_Date, x.Amount, 
      ROW_NUMBER() OVER(PARTITION BY Cust ORDER BY x.Contrib_Date ASC) 
      - 
      ROW_NUMBER() OVER(PARTITION BY Cust ORDER BY x.Amount ASC) AS GroupID 
    FROM @Contrib x 
) y 
GROUP BY y.Cust, y.GroupID, y.Amount 
ORDER BY y.Cust, FromDate; 

輸出繼電器:

Cust FromDate ToDate  Amount 
---- ---------- ---------- ------ 
100 2013-01-01 2013-04-01 500.00 
100 2013-05-05 2013-07-05 600.00 
100 2013-09-10 2013-12-11 500.00 
200 2010-01-01 2010-02-02 100.00 
200 2010-03-09 2010-03-09 300.00 

SQL Fiddle demo

+0

這幾乎工程。問題在於Cust = 200的GroupID將兩個不同的金額(100.00和300.00)組合在一起,並將Amount = 100.00的最早的Contrib_Date用作Amount From = 300.00的FromDate,但對於Amount = 300.00,使用正確的最早的Contrib_Date。所以,在輸出中應該有兩個數量(100.00和300.00),但我只能得到300.00的輸出。 –

+0

@Fred_Scuttle:我更新了我的答案。 –

+0

絕對精彩!我已經嘗試過,它的工作原理。非常感謝波格丹。我現在可以睡了。 –

相關問題