пятница, 12 декабря 2014 г.

Как динамически сформировать список колонок для PIVOT



DECLARE @SQLQuery AS NVARCHAR(MAX)
DECLARE @ColumnNames AS NVARCHAR(MAX)

-- Сформируем список значений для колонок

;WITH ProductLines AS (
    SELECT DISTINCT
       ProductLine
    FROM AdventureWorks2012.Production.Product
)
SELECT @ColumnNames= ISNULL(@ColumnNames + ',','')
       + QUOTENAME(
                  ISNULL(
                         CAST(ProductLine AS VARCHAR(4))
                         ,'NULL'
                      )
              )
FROM ProductLines;

SELECT @ColumnNames AS "ColumnNames";

-- Подготовим строку содержащую запрос
SET @SQLQuery =
N';WITH Src
AS
(
SELECT
    Class
    ,ISNULL(CAST(
                  ProductLine AS VARCHAR(4)
              )
              ,''NULL''
           ) AS ProductLine
    ,ListPrice
FROM AdventureWorks2012.Production.Product
)
SELECT
    Class, ' + @ColumnNames +
'FROM Src
    PIVOT
(
    MAX(ListPrice)
       FOR ProductLine IN (' + @ColumnNames + ')
) AS Pvt'

-- Выполним динамический SQL

EXEC (@SQLQuery)