我正在使用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编程级别更先进的解决方案。
答案 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;