0

我正在使用 SQL Server 2005 处理 Raiser's 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

正如您将看到的,金额列中的一些值为 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 编程水平更高级的解决方案。

4

2 回答 2

1

如果我正确地考虑了这个问题,我相信当 Amount 为 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 时为您提供“等级”。

于 2013-03-19T21:05:23.793 回答
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

于 2013-03-20T20:25:21.373 回答