2015-04-07 70 views
0

我的表有一个ID int(PK),然后是col1-col32字符串。我的专栏中的价值与时间不同。有时候有时会填满10个等等。我可以使这个SQL动态,所以我不必填满我所有的32列?使我的SQL查询变为动态

WITH CTE 
AS 
(
    SELECT * 
    FROM 
    (
     SELECT ID, 
       Column_Name, 
       ROW_NUMBER() OVER (PARTITION BY ID ORDER BY col) row_num, 
       val 
     FROM tPivot A 
     INNER JOIN (SELECT Column_Name AS COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'tPivot') B 
     ON A.ID = B.ORDINAL_POSITION - 1 
     UNPIVOT 
     (
      val for col in (col1,col2,col3,col4,col5) 
     ) unpvt 
    ) A 
    PIVOT 
    (
     MAX(val) FOR column_name IN (col1,col2,col3,col4,col5) 
    ) pvt 
) 

SELECT * 
FROM 
(
    SELECT ID, 
      row_num, 
      coalesce(col1,col2,col3,col4,col5) val 
    FROM cte 
) A 
PIVOT 
(
    MAX(val) FOR ID IN ([1],[2],[3],[4],[5]) 
) pvt 
+4

样本数据提供SQL小提琴 –

+0

HTTP:/ /sqlfiddle.com/#!6/f7cfb/3这是它的样子,需要正确的部分也是动态的 – user2210516

回答

0

很好。 建设的ID为查询(我的意思是([1],[2],[3],[4],[5]))的PIVOT部分使用:

DECLARE @IDP AS NVARCHAR(MAX) 
SELECT @IDP = STUFF((SELECT ',' + QUOTENAME(ID) 
        from (select distinct row_num as ID from CTE) q 
        group by q.ID 
        order by q.ID 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

,现在你可以在dynamic sql使用它:

DECLARE @sql AS NVARCHAR(MAX) 
SET @sql=' 
WITH CTE 
AS 
(
    SELECT * 
    FROM 
    (
     SELECT ID, 
       Column_Name, 
       ROW_NUMBER() OVER (PARTITION BY ID ORDER BY col) row_num, 
       val 
     FROM tPivot A 
     INNER JOIN (SELECT Column_Name AS COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ''tPivot'') B 
     ON A.ID = B.ORDINAL_POSITION - 1 
     UNPIVOT 
     (
      val for col in (col1,col2,col3,col4,col5) 
     ) unpvt 
    ) A 
    PIVOT 
    (
     MAX(val) FOR column_name IN (col1,col2,col3,col4,col5) 
    ) pvt 
) 

SELECT * 
FROM 
(
    SELECT ID, 
      row_num, 
      coalesce(col1,col2,col3,col4,col5) val 
    FROM cte 
) A 
PIVOT 
(
    MAX(val) FOR ID IN ('[email protected]+') 
) pvt' 
EXEC(@sql) 

的基础架构和SQLFIDDLE DEMO您查询你在评论中提到的小提琴演示。

注:也许你原来的查询可以更优化,我只是想说如何使它,并为所有的IDS(行)动态SQL使用

+0

谢谢,但我仍然无法得到它的工作:( – user2210516

+0

不客气,_无法得到它工作:(_有什么问题? – jfun

+0

我不知道在哪里粘贴你的解决方案,以及在哪里作出一些改变:S对不起,我是初学者,这是小提琴中的最初形式,正如我所说的那样,数值是动态的,次。http://sqlfiddle.com/#!6/f7cfb/3 – user2210516