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

большой. для построения идентификаторов для PIVOT части запроса (я имею в виду ([1],[2],[3],[4],[5])) использовать:

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 на основе схемы и ваш запрос в демонстрации скрипта, о которой вы упомянули в комментариях.

Примечание: может быть, исходный запрос может быть более оптимизирован, я просто хотел сказать, как это сделать для использования с динамическим SQL для всех идентификаторов (строк)

+0

Спасибо, но я до сих пор не могу заставить ее работать :( – user2210516

+0

Добро пожаловать, не получится для работы: (_ в чем проблема? – jfun

+0

Я не знаю, где вставить ваше решение и где внести некоторые изменения: S Извините, новичок. Это оргинальный скрипт. Поскольку я сказал, что значения являются динамическими и могут отличаться друг от друга раз. http://sqlfiddle.com/#!6/f7cfb/3 – user2210516

Смежные вопросы