2

我正在寻找使用数据透视函数将列的行值转换为单独的列。该列中有 100 多个不同的值,并且对数据透视函数的“for”子句中的每个值进行硬编码将非常耗时,并且从可维护性的目的来看也不好。我想知道是否有更简单的方法来解决这个问题?

谢谢

4

2 回答 2

5

PIVOT您可以在此类查询中使用动态 SQL 。动态 SQL 将获取您要在执行时转换的项目列表,从而无需对每个项目进行硬编码:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.condition_id) 
            FROM t c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query = 'SELECT memid, ' + @cols + ' from 
            (
                select MemId, Condition_id, condition_result
                from t
           ) x
            pivot 
            (
                sum(condition_result)
                for condition_id in (' + @cols + ')
            ) p '


execute(@query)

请参阅带有演示的 SQL Fiddle

如果您发布需要转换的数据样本,那么我可以调整我的查询来演示。

于 2012-08-09T13:02:08.580 回答
0

我试图这样做并且有这样的 db2 数据。

id,MCD1,MCD2,MCD3,MCD4
1,4,5,4,3
2,6,7,8,9
3,3,6,2,6
4,2,5,8,4
5,3,4,5,6

我在 TSQL 中编写了这个动态 SQL

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

SET @cols = STUFF((SELECT ',', COLUMN_NAME FROM my_db.INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_NAME LIKE 'PivotLonger' AND COLUMN_NAME like 'MCD%'
 FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query = 'SELECT id, MCD, Value
                from [my_db].[dbo].[PivotLonger]
                UNPIVOT  
               (Value FOR MCD IN (' + @cols + ')) AS unpvt'

execute(@query)

导致将列扩展成一个漂亮的长表:)

id,MCD,Value
1,MCD1,4
1,MCD2,5
1,MCD3,4
1,MCD4,3
2,MCD1,6
2,MCD2,7
2,MCD3,8
2,MCD4,9
3,MCD1,3
3,MCD2,6
3,MCD3,2
3,MCD4,6
4,MCD1,2
4,MCD2,5
4,MCD3,8
4,MCD4,4
5,MCD1,3
5,MCD2,4
5,MCD3,5
5,MCD4,6
于 2022-01-08T15:24:04.103 回答