Как в значительной степени прокомментировано, вам нужен столбец, чтобы упорядочить набор данных.Поскольку ваши данные поступают из CSV-файла, вы можете, например, отредактировать файл перед загрузкой, чтобы добавить автоинкрементный номер строки.
Предполагая, что у вас есть этот столбец (id
), здесьрешение SQLServer для вопроса заполнения NULL
значений первым предшествующим не-NULL
значением в том же столбце.
Основная идея состоит в том, чтобы поместить каждую запись в группу, номер которой соответствуетидентификатор первой записи, которая имеет ненулевое значение.Чтобы заполнить 5 столбцов, нам нужно 5 групп.
SELECT
t.* ,
MAX(CASE WHEN FromCompany IS NOT NULL THEN id END) OVER(ORDER BY id ROWS UNBOUNDED PRECEDING) AS grpFromCompany,
MAX(CASE WHEN Container IS NOT NULL THEN id END) OVER(ORDER BY id ROWS UNBOUNDED PRECEDING) AS grpContainer,
MAX(CASE WHEN Numbers IS NOT NULL THEN id END) OVER(ORDER BY id ROWS UNBOUNDED PRECEDING) AS grpNumbers,
MAX(CASE WHEN ToCompany IS NOT NULL THEN id END) OVER(ORDER BY id ROWS UNBOUNDED PRECEDING) AS grpToCompany,
MAX(CASE WHEN Location IS NOT NULL THEN id END) OVER(ORDER BY id ROWS UNBOUNDED PRECEDING) AS grpLocation
FROM mytable t
Возвращает:
id | FromCompany | Container | Numbers | ToCompany | Location | grpFromCompany | grpContainer | grpNumbers | grpToCompany | grpLocation
-: | :---------- | :---------- | ------: | :------------ | :---------- | -------------: | -----------: | ---------: | -----------: | ----------:
1 | DISCOVERY | HALU 330308 | 5 | MAGNA CHARGE | St-Laurent | 1 | 1 | 1 | 1 | 1
2 | <em>null</em> | ATSU 827944 | 0 | LEEZA DIST. | <em>null</em> | 1 | 2 | 2 | 2 | 1
3 | <em>null</em> | <em>null</em> | 4 | <em>null</em> | <em>null</em> | 1 | 2 | 3 | 2 | 1
4 | COLUMBIA | CAIU 807457 | 3 | La Cie Canada | Baie D'Urfe | 4 | 4 | 4 | 4 | 4
5 | <em>null</em> | <em>null</em> | 6 | <em>null</em> | <em>null</em> | 4 | 4 | 5 | 4 | 4
6 | <em>null</em> | <em>null</em> | 0 | <em>null</em> | <em>null</em> | 4 | 4 | 6 | 4 | 4
Теперь мы можем превратить это в CTE и использовать его для поиска соответствующих значений втаблица:
WITH mycte AS (
SELECT
t.* ,
MAX(CASE WHEN FromCompany IS NOT NULL THEN id END) OVER(ORDER BY id ROWS UNBOUNDED PRECEDING) AS grpFromCompany,
MAX(CASE WHEN Container IS NOT NULL THEN id END) OVER(ORDER BY id ROWS UNBOUNDED PRECEDING) AS grpContainer,
MAX(CASE WHEN Numbers IS NOT NULL THEN id END) OVER(ORDER BY id ROWS UNBOUNDED PRECEDING) AS grpNumbers,
MAX(CASE WHEN ToCompany IS NOT NULL THEN id END) OVER(ORDER BY id ROWS UNBOUNDED PRECEDING) AS grpToCompany,
MAX(CASE WHEN Location IS NOT NULL THEN id END) OVER(ORDER BY id ROWS UNBOUNDED PRECEDING) AS grpLocation
FROM mytable t
)
SELECT
id,
(SELECT FromCompany FROM mytable WHERE id = grpFromCompany) AS FromCompany,
(SELECT Container FROM mytable WHERE id = grpFromCompany) AS Container,
(SELECT Numbers FROM mytable WHERE id = grpNumbers) AS Numbers,
(SELECT ToCompany FROM mytable WHERE id = grpToCompany) AS ToCompany,
(SELECT Location FROM mytable WHERE id = grpLocation) AS Location
FROM mycte
GO
id | FromCompany | Container | Numbers | ToCompany | Location
-: | :---------- | :---------- | ------: | :------------ | :----------
1 | DISCOVERY | HALU 330308 | 5 | MAGNA CHARGE | St-Laurent
2 | DISCOVERY | HALU 330308 | 0 | LEEZA DIST. | St-Laurent
3 | DISCOVERY | HALU 330308 | 4 | LEEZA DIST. | St-Laurent
4 | COLUMBIA | CAIU 807457 | 3 | La Cie Canada | Baie D'Urfe
5 | COLUMBIA | CAIU 807457 | 6 | La Cie Canada | Baie D'Urfe
6 | COLUMBIA | CAIU 807457 | 0 | La Cie Canada | Baie D'Urfe
дБ <> скрипка здесь