[英]SSIS Combining multiple rows into a single row with multiple columns
我有一个没有主键的表,但是有一个可用作主键的ID字段。 我想将此表转换为可用于跟踪插入,更新和删除的内容。 仅添加一个Identity列不是一个可行的解决方案,因为该表每天晚上都会重新创建。
该表如下所示:
ID Specialty
-- ---------
01 Fam Med
02 Fam Med
02 Int Med
03 Surgery
03 Thor Sur
03 Card Sur
04 Undersea
我想将其转换为以下内容,并使用ID作为主键:
ID Specialty1 Specialty2 Specialty3
-- ---------- ---------- ----------
01 Fam Med
02 Fam Med Int Med
03 Surgery Thor Sur Card Sur
04 Undersea
我本来倾向于使用SQL数据透视运算符,但是我对数据透视还不够熟悉,并且不确定在这种情况下是否合适。
预先感谢您的输入。
您需要执行PIVOT的SQL是:
SELECT ID,
Specialty1,
Specialty2,
Specialty3
FROM ( SELECT ID,
Specialty,
SpecialtyNum = 'Specialty' +
CAST(ROW_NUMBER() OVER(PARTITION BY ID
ORDER BY Specialty) AS VARCHAR(10))
FROM T
) AS t
PIVOT
( MAX(Specialty)
FOR SpecialtyNum IN ([Specialty1], [Specialty2], [Specialty3])
) AS pvt;
关键是添加了另外一个可以旋转的列,因此子查询的结果为:
SELECT ID,
Specialty,
SpecialtyNum = 'Specialty' +
CAST(ROW_NUMBER() OVER(PARTITION BY ID
ORDER BY Specialty) AS VARCHAR(10))
FROM T;
给你:
ID Specialty SpecialtyNum
-- --------- -------------
01 Fam Med Specialty1
02 Fam Med Specialty1
02 Int Med Specialty2
03 Surgery Specialty1
03 Thor Sur Specialty2
03 Card Sur Specialty3
04 Undersea Specialty1
然后,您可以在SpecialtyNum
列上旋转。 由于specialityNum的每个值对于ID都是唯一的,因此不会因聚合而丢失数据。
但是,由于专业数量未知,您将需要动态生成该专业:
DECLARE @Cols NVARCHAR(MAX) =
STUFF(( SELECT DISTINCT ',[Specialty' + CAST(ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Specialty) AS VARCHAR(10)) + '] '
FROM T
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '');
DECLARE @SQL NVARCHAR(MAX) =
'SELECT ID, ' + @Cols +
'FROM ( SELECT ID,
Specialty,
SpecialtyNum = ''Specialty'' +
CAST(ROW_NUMBER() OVER(PARTITION BY ID
ORDER BY Specialty) AS VARCHAR(10))
FROM T
) AS t
PIVOT
( MAX(Specialty)
FOR SpecialtyNum IN (' + @Cols + ')
) AS pvt;';
EXECUTE sp_executesql @SQL;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.