无光标更新值

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)

Gor*_*off 4

以下查询显示欠款金额(假设使用 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)