如何将另一行中的值插入列中 - 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()
将两个行值放入一列,将另一行值放入另一列,可以将更多行值添加到列中
匹配两列中的单元格值,如果匹配,则将另一个值复制到空白单元格
如何使用 PHP、SQL 和 Microsoft Access 将另一个表中的 select max 函数和用户输入的变量插入表中?