use*_*997 7 sql sql-server azure-sql-database
我在数据库中有一个表.
ID Total Paid Status
1 1000 1000 Paid
2 500 400 Part Paid
3 700 0 Unpaid
4 200 0 Unpaid
Run Code Online (Sandbox Code Playgroud)
现在用户支付PAID_AMT - > $ 900,我想分发这样我的表看起来:
ID Total Paid Status
1 1000 1000 Paid
2 500 500 Paid
3 700 700 Paid
4 200 100 Part Paid
Run Code Online (Sandbox Code Playgroud)
它可以使用游标轻松完成,但我想避免使用游标.
是否可以使用带有Output参数的简单更新查询来实现此目的.
像这样的东西
Update Bill
Set Paid = Total,
Status = 'Paid',
Output PAID_AMT = PAID_AMT - (Total-Paid )
where Total-Paid > PAID_AMT
Run Code Online (Sandbox Code Playgroud)
以下查询显示欠款金额(假设使用 SQL Server 2012):
select b.*,
sum(total - paid) over (order by id) as cumNotPaid
from bill b
Run Code Online (Sandbox Code Playgroud)
您现在可以分配金额:
select b.*,
(case when cumNotPaid >= @AMOUNT then 0
when cumNotPaid - toBePaid <= @AMOUNT then toBePaid
else @AMOUNT - cumnotPaid
end) as PaidAmount
from (select b.*,
sum(total - paid) over (order by id) as cumNotPaid,
total - paid as ToBePaid
from bill b
) b
Run Code Online (Sandbox Code Playgroud)
现在,这是一个可更新的 CTE,因此我们可以在更新语句中使用它:
with toupdate as (
(select b.*,
(case when cumNotPaid >= @AMOUNT then 0
when cumNotPaid - toBePaid <= @AMOUNT then toBePaid
else @AMOUNT - cumnotPaid
end) as PaidAmount
from (select b.*,
sum(total - paid) over (order by id) as cumNotPaid,
total - paid as ToBePaid
from bill b
) b
)
update toupdate
set paid = PaidAmount,
status = (case when total = paid then 'Paid' when total = 0 then 'UnPaid'
else 'PartPaid'
end);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
122 次 |
| 最近记录: |