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;