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

ご覧のとおり、Amount 列の値の一部は £0.00 です。これは、たとえば、寄付者の口座に十分な資金がない場合に発生する可能性があります。

私がやりたいのは、£0.00 以外の支払いの後、または Donor_ID の変更後にリセットされる、連続した £0.00 の支払いの増分カウントを含むフィールドを作成する SQL クエリを作成することです。上記のデータを以下に再現しました。見たいフィールドがあります。

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

このユニオン選択は、Amount が 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 に答える