2015-04-07 68 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