2013-03-19 48 views
0

我有雷塞的邊緣數據庫中使用SQL Server 2005中我已經寫SQL會產生含直接付款分期付款的細節的臨時表的工作。下面是一個包含問題的關鍵變量,我要問,有一些虛構的數據的小桌子:在SQL Server增量計數2005

Donor_ID Instalment_ID Instalment_Date Amount 
1234  1111    01/01/2011   £5.00 
1234  1112    01/02/2011   £0.00 
1234  1113    01/03/2011   £5.00 
1234  1114    01/04/2011   £5.00 
1234  1115    01/05/2011   £0.00 
1234  1116    01/06/2011   £0.00 
2345  2111    01/01/2011   £0.00 
2345  2112    01/02/2011   £5.00 
2345  2113    01/03/2011   £5.00 
2345  2114    01/04/2011   £0.00 
2345  2115    01/05/2011   £0.00 
2345  2116    01/06/2011   £0.00 

正如你將看到,有的在金額列中的值是£0.00。例如,當捐贈者的賬戶資金不足時就會發生這種情況。

我希望做的是寫一個SQL查詢,將創建一個包含連續的0.00£支付的增量計數後非0.00£支付或Donor_ID更改後重置的字段。我已經在下面複製了上述數據,並希望看到該字段。

Donor_ID Instalment_ID Instalment_Date Amount New_Field 
1234  1111    01/01/2011   £5.00  
1234  1112    01/02/2011   £0.00  1 
1234  1113    01/03/2011   £5.00 
1234  1114    01/04/2011   £5.00 
1234  1115    01/05/2011   £0.00  1 
1234  1116    01/06/2011   £0.00  2 
2345  2111    01/01/2011   £0.00  1 
2345  2112    01/02/2011   £5.00 
2345  2113    01/03/2011   £5.00 
2345  2114    01/04/2011   £0.00  1 
2345  2115    01/05/2011   £0.00  2 
2345  2116    01/06/2011   £0.00  3 

爲了澄清我在尋找,我想我在尋找什麼做的是類似於連勝場的橄欖球隊的結果名單上。例如:

Opponent  Score Winning_Streak 
Arsenal  1-0  1 
Liverpool 0-0 
Swansea  3-1  1 
Chelsea  2-1  2 
Fulham  4-0  3 
Stoke  0-0  
Man Utd  1-3 
Reading  2-1  1 

我已經考慮了各種選項,但都沒有取得進展。除非我錯過了顯而易見的東西,否則我認爲可能需要比我當前的SQL編程級別更高級的解決方案。

回答

1

如果我在思考這個問題正確,我相信你想有一個行號時,金額爲0.00磅。

Select 0 as As InsufficientCount 
     , Donor_ID 
     , Installment_ID 
     , Amount 
From [Table] 
Where Amount > 0.00 
Union 
Select Row_Number() Over (Partition By Donor_ID Order By Installment_ID) 
     , Donor_ID 
     , Installment_ID 
     , Amount 
From [Table] 
Where Amount = 0.00 

該聯盟選擇應該只給你 '行列',其中金額等於0

+0

付款後不會將連線重設爲0。 http://sqlfiddle.com/#!6/a571f/28 – flup 2013-03-20 20:37:46

+0

當交易= 0.00時,條紋只會增加,這是@ user2182597描述的。如果事務量大於0,我的查詢只返回0。也許它應該返回NULL或空字符串。 – 2013-03-21 15:18:11

+0

sqlfiddle.com/#!6/a571f/28顯示Donor_ID有3筆交易,其中金額= 0.00和InsufficientCount(更適合'連勝')增加 – 2013-03-21 15:29:27

0

正在呼叫的新領域streakAmount

ALTER TABLE instalments ADD streakAmount int NULL; 

然後,更新值:

UPDATE instalments 
SET streakAmount = 
    (SELECT 
    COUNT(*) 
    FROM 
    instalments streak 
    WHERE 
    streak.donor_id = instalments.donor_id 
    AND 
    streak.instalment_date <= instalments.instalment_date 
    AND 
    (streak.instalment_date > 
    -- find previous instalment date, if any exists 
    COALESCE(
     (
     SELECT 
      MAX(instalment_date) 
     FROM 
      instalments prev 
     WHERE 
      prev.donor_id = instalments.donor_id 
     AND 
      prev.amount > 0 
     AND 
      prev.instalment_date < instalments.instalment_date 
    ) 
    -- otherwise min date 
    , cast('1753-1-1' AS date)) 
    ) 
) 
WHERE 
    amount = 0; 

http://sqlfiddle.com/#!6/a571f/18