Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 SQL Server 2005中的增量计数_Sql Server 2005_Counter - Fatal编程技术网

Sql server 2005 SQL Server 2005中的增量计数

Sql server 2005 SQL Server 2005中的增量计数,sql-server-2005,counter,Sql Server 2005,Counter,我正在使用SQLServer2005处理一个Raiser的边缘数据库。我已经编写了SQL,它将生成一个临时表,其中包含直接借记分期付款的详细信息。下面是一个小表格,其中包含我要问的问题的关键变量,以及一些虚构的数据: Donor_ID Instalment_ID Instalment_Date Amount 1234 1111 01/01/2011 £5.00 1234 1112 01

我正在使用SQLServer2005处理一个Raiser的边缘数据库。我已经编写了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英镑付款或更改捐赠者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编程级别更高级的解决方案

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

我正在调用您的新字段“等级金额”

然后,要更新该值,请执行以下操作:

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;

这不会在付款时将条纹重置为0。只有当事务=0.00时,条纹才会增加,这就是@user2182597所描述的。我的查询仅在交易金额大于0时返回0。也许它应该返回NULL或空字符串。sqlfiddle.com/!6/a571f/28显示捐赠者ID有3个事务处理,其中金额=0.00,更合适的是“不足计数”增加。如图2345 2114所示,应为1,因为第2345 2113行将“不足计数”重置为0。相反,它说2。第2345 2111行是第一行,第2345 2114行是第二行。事务处理2112和2113的金额均大于0。
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;