如何将另一行中的值插入列-SQL Server

如何将另一行中的值插入列-SQL Server,sql,sql-server,sql-update,common-table-expression,window-functions,Sql,Sql Server,Sql Update,Common Table Expression,Window Functions,我正在为一个项目开发SQL,我需要根据一些规则更新Soh_Whu a和Soh_Whu B 这是表A: | Code | Warehouse | StockOnHand | Wh_A | Wh_B ---------------------------------------------------- | 001 | A | 10 | NULL | NULL | 001 | B | 20 |

我正在为一个项目开发SQL,我需要根据一些规则更新Soh_Whu a和Soh_Whu B

这是表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列填充whu 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)




您可以使用窗口功能:

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

您可以使用窗口功能:

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

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