Моя программа должна передать сумму в запрос для выполнения такого расчета, но в моем случае она циклически перебирается по строке за строкой и вычитает правильную сумму, я знаю это не является эффективным способом реализации. поэтому я здесь, чтобы искать лучший способ.Лучший способ выполнить такую логику вычислений в 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
Ваша помощь должна оценить. thank
+1 для подачи полный образец кода. (Хотя 'while @total_value_to_deduct <= 0' не имеет никакого смысла, так как оно начинается с 0) – Tomalak
второстепенная точка:' close' и 'deallocate' также являются неправильными. – Jamiec
извините за это .. я уже изменил соответственно – skywills