Заполните несколько столбцов в строке - PullRequest
1 голос
/ 23 сентября 2019

Из стороннего приложения я получаю данные для импорта в tsql.В нашей таблице базы данных есть четыре поля, соответствующие нашим полям.Но логика другая.3-стороннее приложение не имеет «заполняющей структуры».Но нам нужно заполнить поля справа налево без пробелов.

DECLARE @input TABLE ( field1 VARCHAR(60)
,                      field2 VARCHAR(60)
,                      field3 VARCHAR(60)
,                      field4 VARCHAR(60) )

/*Input Data from 3rd-party app*/
INSERT @input
VALUES ( 'row1field1', NULL,         NULL,         NULL         )
,      ( 'row2field1', 'row2field2', NULL,         NULL         )
,      ( 'row3field1', 'row3field2', 'row3field3', NULL         )
,      ( 'row4field1', 'row4field2', NULL,         'row4field4' )

Ожидаемый результат должен быть:

|NULL|NULL      |NULL      |row1field1|
|NULL|NULL      |row2field1|row2field2|
|NULL|row3field1|row3field2|row3field3|
|NULL|row4field1|row4field2|row4field4|

Я пытался CASE, чтобы решить эту проблему, но, конечно, естько многим комбинациям.Или, может быть, использовать STRING_AGG, а затем разделить его снова, но швы немного странные.

1 Ответ

3 голосов
/ 23 сентября 2019

Это должно работать при условии, что во входе всегда есть первый столбец, и он имеет уникальное значение.Если это не так, вам понадобится дополнительный начальный шаг с другим row_number, чтобы дать вам что-то уникальное в качестве группы строк.

Мы удаляем столбцы, упорядочиваем их, а затем снова поворачиваем их в нужном порядке..

WITH FieldsUnpivoted AS
(
SELECT 
I.field1 AS RowGroup
,Fields.Field
,Fields.OrderNo
,ROW_NUMBER() OVER (PARTITION BY I.Field1 ORDER BY Fields.OrderNo DESC) AS FieldOrder
FROM @input AS I
CROSS APPLY 
    (VALUES 
         (I.field1,1)
        ,(I.field2,2)
        ,(I.field3,3)
        ,(I.field4,4)
    ) AS Fields(Field,OrderNo)
WHERE Fields.Field IS NOT NULL
)
SELECT 
RowGroup
,MIN(CASE WHEN FieldOrder = 4 THEN Field ELSE NULL END) AS Field1 
,MIN(CASE WHEN FieldOrder = 3 THEN Field ELSE NULL END) AS Field1 
,MIN(CASE WHEN FieldOrder = 2 THEN Field ELSE NULL END) AS Field1 
,MIN(CASE WHEN FieldOrder = 1 THEN Field ELSE NULL END) AS Field1 
FROM FieldsUnpivoted
GROUP BY RowGroup
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...