繁体   English   中英

如何遍历表并更新多行

[英]How to loop through table and update multiple rows

嗨,基于下面的表,我有2个表,其中名称是销售记录历史记录,另一个是销售信息..基于销售信息表,乔什卖了100,我如何更新以出售记录历史记录表

场景:

josh套餐一已售出50如何将其100的销售信息加到package 1 50追加到已售出,因为最大上限为100,而已售出的余额又添加到josh的套餐2中

 table - sell Record history name package max cap sold Josh 1 100 0 Jack 1 100 0 Josh 2 100 0 Austin 1 100 0 table -sell info name sold Josh 150 Jack 0 Austin 0 

预期的输出将是:

name    |package|max cap    |sold
Josh    |1      |100        |100
Jack    |1      |100        |0
Josh    |2      |100        |50
Austin  |1      |100        |0

在一个简单的查询中无法做到这一点。 我下面的查询使用递归CTE。

假设:程序包是数字的,从1开始并以1为增量无间隙

-- Create sample table
declare @sell_record table
(
    name        varchar(6),
    package     int,
    max_cap     int,
    sold        int
)

declare @sell_info table
(
    name        varchar(6),
    sold        int
)

-- Insert sample data
insert into @sell_record select 'Josh', 1, 100, 0
insert into @sell_record select 'Jack', 1, 100, 0
insert into @sell_record select 'Josh', 2, 100, 0
insert into @sell_record select 'Austin', 1, 100, 0

insert into @sell_info select 'Josh', 150
insert into @sell_info select 'Jack', 0
insert into @sell_info select 'Austin', 0

-- The query. rcte is recursive cte
; with rcte as
(
    -- anchor member. Starts with package 1
    select  i.name, r.package,
            -- allocation of sold_qty to package
            alloc    = case when i.sold >= r.max_cap - r.sold 
                            then r.max_cap - r.sold 
                            else i.sold
                            end,
            -- balance of the sold qty after allocated
            bal_sold = case when i.sold >= r.max_cap - r.sold 
                            then i.sold - r.max_cap - r.sold 
                            else 0
                            end
    from    @sell_info i
            inner join @sell_record r   on  i.name  = r.name 
    where   r.package   = 1

    union all

    -- recursive member
    select  c.name, r.package,
            -- allocation of sold_qty to package
            alloc   = case  when c.bal_sold >= r.max_cap - r.sold 
                            then r.max_cap - r.sold 
                            else c.bal_sold
                            end,
            -- balance of the sold qty after allocated
            bal_sold = case when c.bal_sold >= r.max_cap - r.sold 
                            then c.bal_sold - r.max_cap - r.sold 
                            else 0
                            end
    from    rcte c
            inner join @sell_record r   on  c.name      = r.name 
                                        and c.package   = r.package - 1
)
-- Update back sell_record
update  r
set    sold = c.alloc
from    rcte c
        inner join @sell_record r   on  c.name  = r.name
                                    and c.package   = r.package

-- show the result
select  *
from    @sell_record

/*
name    package max_cap sold
Josh    1   100 100
Jack    1   100 0
Josh    2   100 50
Austin  1   100 0
*/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM