2012-08-09 111 views
0

我期待使用pivot函数将列的行值转换为单独的列。该列中有100多个不同的值,并且对透视函数的'for'子句中的每个单独的值进行硬编码将非常耗时并且从可维护性的角度来看并不好。我想知道是否有更简单的方法来解决这个问题?TSQL数据透视长列表

感谢

+0

可能重复的[SQL Server动态PIVOT查询?](http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query) – RichardTheKiwi 2013-05-03 09:44:09

回答

3

您可以使用动态SQL的PIVOT对于这种类型的查询。动态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 with Demo

如果您发布数据的样本,你需要进行转换,然后我可以调整我的查询来演示。