SQL 用于替换单个 NULL 值的语句/存储过程 table
SQL statement / stored procedure to replace NULL values in single table
对 SQL 很陌生,我遇到了以下问题。如果这是一个简单的修复,我深表歉意。今天早上我看过的所有替换问题似乎都没有解决这个确切的问题。
我正在使用 SQL Server 2017 并且我有一个类似于下面的 table,实际 table 是 100k+ 行但是遵循这种格式,它只是有更多的个人项目和列:
ColA ColB ColC ColD ColE ColF
---- ---- ---- ---- ---- ----
ROW1 Item1 2341 Null Null Null
ROW2 Item2 7953 Null Null Null
ROW3 Item1 Null 2342 Null Null
ROW4 Item2 Null 9827 Null Null
ROW5 Item1 Null Null 1945 Null
ROW6 Item2 Null Null 0745 Null
ROW7 Item1 Null Null Null 1298
ROW8 Item2 Null Null Null 2356
有没有办法以编程方式更新 table,以便 ROW1 和 ROW2 具有 D、E 和 F 列的所有非 NULL 值?
这 2 条语句应该可以满足您的需求。如果您只是在 SELECT
语句之后,那么第一个就是您所追求的。如果您实际上想要 UPDATE
所有行,那么您需要带有 CTE 的行:
USE Sandbox;
GO
CREATE TABLE dbo.Tab (ColA char(4),
ColB char(5),
ColC char(5),
ColD char(5),
ColE char(5),
ColF char(5));
INSERT INTO dbo.Tab (ColA,
ColB,
ColC,
ColD,
ColE,
ColF)
VALUES('ROW1','Item1',2341,Null,Null,Null),
('ROW2','Item2',7953,Null,Null,Null),
('ROW3','Item1',Null,2342,Null,Null),
('ROW4','Item2',Null,9827,Null,Null),
('ROW5','Item1',Null,Null,1945,Null),
('ROW6','Item2',Null,Null,0745,Null),
('ROW7','Item1',Null,Null,Null,1298),
('ROW8','Item2',Null,Null,Null,2356);
GO
SELECT ColA,
ColB,
MAX(ColC) OVER (PARTITION BY ColB) AS ColC,
MAX(ColD) OVER (PARTITION BY ColB) AS ColD,
MAX(ColE) OVER (PARTITION BY ColB) AS ColE,
MAX(ColF) OVER (PARTITION BY ColB) AS ColF
FROM dbo.Tab
ORDER BY ColB;
GO
WITH CTE AS(
SELECT ColA,
ColB,
ColC,
ColD,
ColE,
ColF,
MAX(ColC) OVER (PARTITION BY ColB) AS ColCn,
MAX(ColD) OVER (PARTITION BY ColB) AS ColDn,
MAX(ColE) OVER (PARTITION BY ColB) AS ColEn,
MAX(ColF) OVER (PARTITION BY ColB) AS ColFn
FROM dbo.Tab)
UPDATE CTE
SET ColC = ColCn,
ColD = ColDn,
ColE = ColEn,
ColF = ColFn;
GO
SELECT *
FROM Tab;
GO
DROP TABLE dbo.Tab;
对 SQL 很陌生,我遇到了以下问题。如果这是一个简单的修复,我深表歉意。今天早上我看过的所有替换问题似乎都没有解决这个确切的问题。
我正在使用 SQL Server 2017 并且我有一个类似于下面的 table,实际 table 是 100k+ 行但是遵循这种格式,它只是有更多的个人项目和列:
ColA ColB ColC ColD ColE ColF
---- ---- ---- ---- ---- ----
ROW1 Item1 2341 Null Null Null
ROW2 Item2 7953 Null Null Null
ROW3 Item1 Null 2342 Null Null
ROW4 Item2 Null 9827 Null Null
ROW5 Item1 Null Null 1945 Null
ROW6 Item2 Null Null 0745 Null
ROW7 Item1 Null Null Null 1298
ROW8 Item2 Null Null Null 2356
有没有办法以编程方式更新 table,以便 ROW1 和 ROW2 具有 D、E 和 F 列的所有非 NULL 值?
这 2 条语句应该可以满足您的需求。如果您只是在 SELECT
语句之后,那么第一个就是您所追求的。如果您实际上想要 UPDATE
所有行,那么您需要带有 CTE 的行:
USE Sandbox;
GO
CREATE TABLE dbo.Tab (ColA char(4),
ColB char(5),
ColC char(5),
ColD char(5),
ColE char(5),
ColF char(5));
INSERT INTO dbo.Tab (ColA,
ColB,
ColC,
ColD,
ColE,
ColF)
VALUES('ROW1','Item1',2341,Null,Null,Null),
('ROW2','Item2',7953,Null,Null,Null),
('ROW3','Item1',Null,2342,Null,Null),
('ROW4','Item2',Null,9827,Null,Null),
('ROW5','Item1',Null,Null,1945,Null),
('ROW6','Item2',Null,Null,0745,Null),
('ROW7','Item1',Null,Null,Null,1298),
('ROW8','Item2',Null,Null,Null,2356);
GO
SELECT ColA,
ColB,
MAX(ColC) OVER (PARTITION BY ColB) AS ColC,
MAX(ColD) OVER (PARTITION BY ColB) AS ColD,
MAX(ColE) OVER (PARTITION BY ColB) AS ColE,
MAX(ColF) OVER (PARTITION BY ColB) AS ColF
FROM dbo.Tab
ORDER BY ColB;
GO
WITH CTE AS(
SELECT ColA,
ColB,
ColC,
ColD,
ColE,
ColF,
MAX(ColC) OVER (PARTITION BY ColB) AS ColCn,
MAX(ColD) OVER (PARTITION BY ColB) AS ColDn,
MAX(ColE) OVER (PARTITION BY ColB) AS ColEn,
MAX(ColF) OVER (PARTITION BY ColB) AS ColFn
FROM dbo.Tab)
UPDATE CTE
SET ColC = ColCn,
ColD = ColDn,
ColE = ColEn,
ColF = ColFn;
GO
SELECT *
FROM Tab;
GO
DROP TABLE dbo.Tab;