Оператор SQL / хранимая процедура для замены значений NULL в одной таблице - PullRequest
0 голосов
/ 08 февраля 2019

Очень плохо знаком с SQL, и у меня возникла следующая проблема.Я прошу прощения, если это простое исправление.Все вопросы по замене, которые я рассмотрел сегодня утром, похоже, не решили именно эту проблему.

Я использую SQL Server 2017, и у меня есть таблица, подобная следующей, фактическая таблица составляет 100 000+ строк, но соответствует этому формату, она просто имеет больше отдельных элементов и столбцов:

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

Есть ли способ программно обновить таблицу, чтобы ROW1 и ROW2 имели все значения, отличные от NULL, для столбцов D, E и F?

1 Ответ

0 голосов
/ 08 февраля 2019

Эти 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;
...