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

Posted

技术标签:

【中文标题】如何将另一行中的值插入列中 - SQL Server【英文标题】:How to insert a value from another row into a column - 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)



【问题讨论】:

用您正在使用的数据库标记您的问题。 【参考方案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

【讨论】:

以上是关于如何将另一行中的值插入列中 - SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

如何将另一整列作为参数传递给 pandas fillna()

如何在代码中的sql表列中插入默认值

将两个行值放入一列,将另一行值放入另一列,可以将更多行值添加到列中

匹配两列中的单元格值,如果匹配,则将另一个值复制到空白单元格

如何使用 PHP、SQL 和 Microsoft Access 将另一个表中的 select max 函数和用户输入的变量插入表中?

如何使用变量“最后一行号”来设置另一列中的范围