私のプログラムでは、このような計算を行うためにクエリに量を渡す必要がありますが、私の場合は行ごとにループして正しい量を差し引いています。効率的な実装方法ではありません。私はここでより良い方法を模索しています。T-SQLでそのような計算ロジックを実行する最善の方法
PS:私のドラフトコードです。何らかの理由で完全なソースコードを投稿できないのは残念です。今、私はコードをより完全かつ合理的にするために再構造化しました。
--- the amount column is just for reference.
insert into tbl1 (idx,amount,balance) values (1, 50, 50)
insert into tbl1 (idx,amount,balance) values (2, 30, 30)
insert into tbl1 (idx,amount,balance) values (3, 20, 20)
insert into tbl1 (idx,amount,balance) values (4, 50, 50)
insert into tbl1 (idx,amount,balance) values (5, 60, 60)
declare @total_value_to_deduct int
declare @cs_index int, @cs_balance int, @deduct_amount int
set @total_value_to_deduct = 130
declare csDeduct Cursor for select idx, balance from tbl1 where balance > 0
open csDeduct fetch next from csDeduct into @cs_index, @cs_balance
while @@FETCH_STATUS = 0 and @total_value_to_deduct > 0
begin
if @cs_balance >= @total_value_to_deduct
set @deduct_amount = @total_value_to_deduct
else
set @deduct_amount = @cs_balance
-- contine deduct row by row if the total_value_to_deduct is not 0
set @total_value_to_deduct = @total_value_to_deduct - @deduct_amount
update tbl1 set balance = balance - @deduct_amount where idx = @cs_index
fetch next from csDeduct into @cs_index, @cs_balance
end
close csDeduct
deallocate csDeduct
期待される結果:
idx amount balance
1 50 0
2 30 0
3 20 0
4 50 20
5 60 60
あなたの助けに感謝しなければならないです。
+1。 (while @total_value_to_deduct <= 0'は意味がありませんが、最初から> 0なので) – Tomalak
minorポイント: 'close'と' deallocate'は間違った方向です。 – Jamiec
申し訳ありませんが、私はすでにそれに応じて変更しました – skywills