动态数据库SQL列数据到标题

时间:2016-07-14 19:27:18

标签: sql-server dynamic-pivot

我想转置下表,以便第一列(tabLabel)成为标题。我需要动态地执行此操作,因为行数未知。我已经看过关于动态支点的帖子,但我不完全明白如何做到这一点。

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

最终版本:

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 [tabLabel]
  ,[documentId]
  ,[recipientId]
  ,[Date]
  ,[value]
  FROM [zDocusign_Document_Tab_Fields]

1 个答案:

答案 0 :(得分:3)

动态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)