0

これは私の質問のフォローアップのようなものです。列を参照し、同じステートメントで更新します。現在、ローカル変数を使用して、同じ更新ステートメントで更新しようとしています。

declare @tmp table (ID int primary key, UNPAID money)

insert into @tmp select 1, 31.63
insert into @tmp select 2, 49.20
insert into @tmp select 3, 99.00
insert into @tmp select 4, 41.00

declare @paymentAmmount money
select @paymentAmmount = SUM(UNPAID) from @tmp
            
declare cur_oustandingAR cursor local static for select ID  from @tmp order by ID
open cur_oustandingAR

declare @currentID int

fetch next from cur_oustandingAR into @currentID
while (@@fetch_status = 0 and @paymentAmmount > 0)
begin
    begin
        update @tmp
            set UNPAID = case when @paymentAmmount > UNPAID then 0 else UNPAID - @paymentAmmount end,
                @paymentAmmount = case when @paymentAmmount > UNPAID then @paymentAmmount - UNPAID else 0 end
            where ID = @currentID
    end
    fetch next from cur_oustandingAR into @currentID
end

select * from @tmp
select @paymentAmmount as LeftoverPayment

ここでクエリを実行できます。これが結果です。

ID未払い
----------- ---------------------
1 0.00
2 0.00
3 58.00
4 41.00

LeftoverPayment
---------------
0               

すべての値は0@paymentAmmountであり、最後には0である必要があります。値が正しく適用されない原因となっている問題は何ですか。


PS私はそれを修正する方法を知っています、ただ1つのクエリを次の3つのクエリに分割します、しかし私はそれを単一のクエリとしてやりたかったので、実際のテーブルに対してそれほど多くのルックアップを必要としませんでした

select @oldUnpaid = UNPAID from @tmp where ID = @currentID
update @tmp 
    set UNPAID = case when @paymentAmmount > UNPAID then 0 else UNPAID - @paymentAmmount end
    where ID = @currentID
select @paymentAmmount = case when @paymentAmmount > @oldUnpaid then @paymentAmmount - @oldUnpaid else 0 end

私が今していることがうまくいかない理由を知りたかっただけです。

4

1 に答える 1

1
declare @tmp table (ID int primary key, UNPAID money)

insert into @tmp select 1, 31.63
insert into @tmp select 2, 49.20
insert into @tmp select 3, 99.00
insert into @tmp select 4, 41.00

declare @paymentAmmount money
declare @paymentAmmountbuf money
select @paymentAmmount = SUM(UNPAID) from @tmp
declare cur_oustandingAR cursor local static for select ID  from @tmp order by ID
open cur_oustandingAR

declare @currentID int

fetch next from cur_oustandingAR into @currentID
while (@@fetch_status = 0 and @paymentAmmount > 0)
begin
    begin
        select @paymentAmmountbuf=@paymentAmmount

        update @tmp
            set UNPAID = case when @paymentAmmountbuf > UNPAID then 0 else UNPAID - @paymentAmmountbuf end,
                @paymentAmmount = case when @paymentAmmount > UNPAID then @paymentAmmount - UNPAID else 0 end
            where ID = @currentID
    end
    fetch next from cur_oustandingAR into @currentID
end

select * from @tmp
select @paymentAmmount as LeftoverPayment
于 2012-11-21T00:46:21.383 に答える