我正在寻找使用数据透视函数将列的行值转换为单独的列。该列中有 100 多个不同的值,并且对数据透视函数的“for”子句中的每个值进行硬编码将非常耗时,并且从可维护性的目的来看也不好。我想知道是否有更简单的方法来解决这个问题?
谢谢
我正在寻找使用数据透视函数将列的行值转换为单独的列。该列中有 100 多个不同的值,并且对数据透视函数的“for”子句中的每个值进行硬编码将非常耗时,并且从可维护性的目的来看也不好。我想知道是否有更简单的方法来解决这个问题?
谢谢
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)
如果您发布需要转换的数据样本,那么我可以调整我的查询来演示。
我试图这样做并且有这样的 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