【问题标题】:How to insert a value from another row into a column - SQL Server如何将另一行中的值插入列中 - SQL Server
【发布时间】:2020-08-05 18:35:06
【问题描述】:

我正在为一个项目编写 SQL,我需要根据一些规则更新 Soh_Wh_A 和 Soh_Wh_B。

这是table_A:

| Code  | Warehouse | StockOnHand | Wh_A     | Wh_B 
----------------------------------------------------
| 001   | A         | 10          | NULL     | NULL     
| 001   | B         | 20          | NULL     | NULL     
| 003   | A         | 30          | NULL     | NULL     
| 033   | B         | 40          | NULL     | NULL     

我想填充列 Wh_A 和 Wh_B。例如,让我们处理第一行,Wh_A 应该具有与 StockOnHand 列相同的值,因为该行属于仓库“A”。使用 update case when 语句很容易做到这一点。

对我来说困难的是用第二行的 StockOnHand 列填充 Wh_B 列。

表格最后应该是这样的。

| Code  | Warehouse | StockOnHand | Wh_A     | Wh_B 
----------------------------------------------------
| 001   | A         | 10          | 10       | 20
| 001   | B         | 20          | 10       | 20
| 003   | A         | 30          | 30       | 40     
| 033   | B         | 40          | 30       | 40     

这是我到目前为止所做的......

update Table_A set
Wh_A = (case 
        when warehouse = 'A' then stockOnHand
        when warehouse = 'B' then ... end)
Wh_B = (case 
        when warehouse = 'A' then stockOnHand
        when warehouse = 'B' then ... end)



【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql sql-server sql-update common-table-expression window-functions


【解决方案1】:

你可以使用窗口函数:

select 
    code,
    warehouse,
    stockOnHand,
    max(case when warehouse = 'A' then stockOnHand end)
        over(partition by code) wh_a,
    max(case when warehouse = 'B' then stockOnHand end)
        over(partition by code) wh_b
from table_a

使用可更新的 cte 很容易将其转换为 update 查询:

with cte as (
    select 
        wh_a,
        wh_b
        max(case when warehouse = 'A' then stockOnHand end)
            over(partition by code) new_wh_a,
        max(case when warehouse = 'B' then stockOnHand end)
            over(partition by code) new_wh_b
    from table_a
)
update cte set wh_a = new_wh_a, wh_b = new_wh_b

【讨论】:

    【解决方案2】:
    declare @Table table (
        Code        char(3) not null,
        Warehouse   char(1) not null,
        StockOnHand int     not null,
        Wh_A        int         null,
        Wh_B        int         null,
    
        primary key (Code, Warehouse)
    );
    
    insert into @Table
        (Code, Warehouse, StockOnHand)
    values 
        ('001', 'A', 10), 
        ('001', 'B', 20), 
        ('003', 'A', 30), 
        ('003', 'B', 40);
    
    update t set
        Wh_A = (select top 1 StockOnHand from @Table a where a.Warehouse = 'A' and a.Code = t.Code),
        Wh_B = (select top 1 StockOnHand from @Table b where b.Warehouse = 'B' and b.Code = t.Code)
    from 
        @Table t;
    
    
    select * from @Table
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 2017-02-07
      • 2021-11-01
      • 1970-01-01
      • 2018-04-12
      • 2012-03-24
      相关资源
      最近更新 更多