SQL Server 2005中的增量计数

时间:2013-03-19 08:59:04

标签: sql-server-2005 counter

我正在使用SQL Server 2005使用Raiser的Edge数据库。我编写的SQL将生成一个临时表,其中包含直接借记分期付款的详细信息。下面是一个小表,其中包含我要问的问题的关键变量,以及一些虚构的数据:

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

正如您将看到的,Amount列中的某些值为£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编程级别更先进的解决方案。

2 个答案:

答案 0 :(得分: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的“等级”。

答案 1 :(得分: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