Search code examples
sql-serverdynamic-pivot

Dynamic Pivot SQL Column Data to Header


I would like to transpose the following table so that the first column (tabLabel) becomes the header. I need to do this dynamically, because the number of rows is unknown. I've seen posts on dynamic pivots, but I don't fully understand how this would be done.

tabLabel            documentId  recipientId     Date    value
Street Address          1           1           NULL    123 mockingbird lane
City                    1           1           NULL    city
Patient Phone           1           1           NULL    999-999-9999
Responsible Phone       1           1           NULL    999-999-9999
Gross Income            1           1           NULL    999
Monthly Mortgage/Rent   1           1           NULL    100
Monthly Auto            1           1           NULL    200

Final version:

Street Address         City   Patient Phone   Responsible Phone   Gross Income  Monthly Mortage/Rent   Monthly Auto   documentId   recipientId   Date
123 mockingbird lane   city   999-999-9999    999-999-9999        999           100                    200            1             1            NULL

Select Query on Original Table:

SELECT [tabLabel]
  ,[documentId]
  ,[recipientId]
  ,[Date]
  ,[value]
  FROM [zDocusign_Document_Tab_Fields]

Solution

  • dynamic sql

    -- Build colums
    DECLARE @cols NVARCHAR(MAX)
    SELECT  @cols = STUFF((
        SELECT  DISTINCT ',' + QUOTENAME([tabLabel])
        FROM    zDocusign_Document_Tab_Fields
        FOR XML PATH('')
    ), 1, 1, '')
    -- Selecting as FOR XML PATH will give you a string value with all of the fields combined
    -- separated by comma.  Stuff simply removes the first comma.
    -- Quotename wraps the [tabLabel] value in brackets to allow for spaces in column name
    -- You end up with
    -- [City],[Gross Income],[Monthly Auto],[Monthly Mortgage/Rent],[Patient Phone],[Responsible Phone],[Street Address]
    
    -- Build sql
    DECLARE @sql NVARCHAR(MAX)
    SET     @sql = N'
        SELECT  ' + @cols +' 
        FROM    zDocusign_Document_Tab_Fields
        PIVOT   (
            MAX([value])
            FOR [tabLabel] IN (' + @cols + ')
        ) p
    '
    
    -- Execute Sql
    EXEC(@sql)