每行填充多列
Fill multiple columns per row
我从 3 方应用程序收到要导入到 tsql 中的数据。在我们的数据库中有四个字段匹配我们的字段table。但逻辑不同。
3方应用没有'filling structure'。但是我们需要从右到左无间隙地填充字段。
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 然后再拆分它,但接缝有点奇怪。
假设输入中始终有第一列并且它具有唯一值,这应该可以工作。如果不是,您将需要一个额外的初始步骤和另一个 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
我从 3 方应用程序收到要导入到 tsql 中的数据。在我们的数据库中有四个字段匹配我们的字段table。但逻辑不同。 3方应用没有'filling structure'。但是我们需要从右到左无间隙地填充字段。
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 然后再拆分它,但接缝有点奇怪。
假设输入中始终有第一列并且它具有唯一值,这应该可以工作。如果不是,您将需要一个额外的初始步骤和另一个 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