繁体   English   中英

SSIS将多行合并为具有多列的单行

[英]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;

SQL小提琴示例

关键是添加了另外一个可以旋转的列,因此子查询的结果为:

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;

SQL小提琴示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM