Sql PIVOT and string concatenation aggregate

前端 未结 4 1766
梦谈多话
梦谈多话 2020-11-27 19:45

I would like to use a pivot SQL query to construct a result table where the concatenate text as a result within the DATA section of the pivot table.

i.e. i have the

4条回答
  •  萌比男神i
    2020-11-27 20:08

    Full working example:

    SET NOCOUNT ON
    GO
    
        DECLARE @SourceTable TABLE
        (
             EventName NVARCHAR(10)
            ,ResourceType NVARCHAR(20)
            ,ResourceName NVARCHAR(20)
        )
    
        INSERT INTO @SourceTable(EventName,ResourceType,ResourceName)
        VALUES   ('Event 1','Resource Type 1','Resource 1')
                ,('Event 1','Resource Type 1','Resource 2') 
                ,('Event 1','Resource Type 2','Resource 3') 
                ,('Event 1','Resource Type 2','Resource 4')
                ,('Event 1','Resource Type 3','Resource 5') 
                ,('Event 1','Resource Type 3','Resource 6') 
                ,('Event 1','Resource Type 3','Resource 7') 
                ,('Event 1','Resource Type 4','Resource 8') 
                ,('Event 2','Resource Type 5','Resource 1') 
                ,('Event 2','Resource Type 2','Resource 3') 
                ,('Event 2','Resource Type 3','Resource 11')
                ,('Event 2','Resource Type 3','Resource 12')
                ,('Event 2','Resource Type 3','Resource 13')
                ,('Event 2','Resource Type 4','Resource 14')
                ,('Event 2','Resource Type 5','Resource 9') 
                ,('Event 2','Resource Type 5','Resource 16') 
    
        ;WITH SourceTable AS
        (
            SELECT DISTINCT ST1.EventName
                           ,ST1.ResourceType
                           ,(SELECT SUBSTRING((SELECT ',' +ResourceName 
                                               FROM @SourceTable AS ST2
                                               WHERE ST1.EventName=ST2.EventName AND ST1.ResourceType=ST2.ResourceType 
                                               FOR XML PATH('')),2,200) AS CSV) AS ResourceName
            FROM @SourceTable AS ST1
        )
        SELECT    EventName
                ,[Resource Type 1]
                ,[Resource Type 2]
                ,[Resource Type 3]
                ,[Resource Type 4]
                ,[Resource Type 5]
        FROM 
        (
            SELECT EventName
                  ,ResourceType
                  ,ResourceName
            FROM SourceTable
        ) PivotSource
        PIVOT
        (
            MAX(ResourceName) FOR ResourceType  IN ([Resource Type 1],[Resource Type 2],[Resource Type 3],[Resource Type 4],[Resource Type 5])
        ) PivotTable
    
    SET NOCOUNT OFF
    GO
    

提交回复
热议问题