Динамический SQL Server 2005 Pivot - PullRequest
       0

Динамический SQL Server 2005 Pivot

2 голосов
/ 26 сентября 2011

Я разработал способ поворота строки из таблицы с помощью PIVOT в SQL Server 2005, однако мне не понравился этот метод, поскольку мне пришлось жестко кодировать столбцы (коды валют), и я хотел бы получить сводную таблицу динамически выбирать столбцы.

В качестве примера представьте, что у вас есть следующая таблица (называемая OrderCash):

OrderID   CAD     CHF     EUR     GBP     JPY     NOK     USD
40        0       0       128.6   552.25  -9232   0       -4762
41        0       0       250.2   552.25  -9232   0       -4762
42        233.23  0       552.25  -9232   0       0       -4762

Жестко закодированный оператор Pivot:

SELECT  OrderID,
        CurrCode + 'GBP CURNCY' AS Ticker,
        Cash AS Position
FROM
(
    SELECT OrderID,
        CAD,
        CHF,
        EUR,
        GBP,
        JPY,
        NOK,
        USD
    FROM OrderCash
) p
UNPIVOT
(
    Cash FOR CurrCode IN 
    (CAD, CHF, EUR, GBP, JPY, NOK, USD)
) AS unpvt
WHERE Cash != 0
And OrderID = 42

Это вернет следующую обязательную таблицу:

OrderID   Ticker           Position
42        CADGBP CURNCY    233.23
42        EURGBP CURNCY    552.25
42        GBPGBP CURNCY    -9232
42        USDGBP CURNCY    -4762

Проблема возникает еще дальше, когда кто-то говорит мне, что мне нужно иметь AUD в качестве новой валюты в таблице?

К вашему сведению, у меня есть табличная функция, которая возвращает все имена столбцов в виде таблицы:

ALTER FUNCTION [dbo].[GetTableColumnNames]
        (
        @TableName NVARCHAR(250),
        @StartFromColumnNum INT
        )

    RETURNS @ReturnTable TABLE
        (
        ColName NVARCHAR(250)
        )
AS

BEGIN
    INSERT INTO @ReturnTable
        SELECT COLUMN_NAME from information_schema.columns
        WHERE TABLE_NAME = @TableName
            AND ORDINAL_POSITION >= @StartFromColumnNum
        ORDER BY ORDINAL_POSITION

    RETURN
END 

Итак, легкий бит сделан (SELECT * FROM dbo.GetTableColumnNames ('OrderCash', 2)), проблема, с которой я сталкиваюсь, заключается в вставке этой «динамической» таблицы с именами столбцов в Pivot?

Любая помощь будет высоко ценится. Большое спасибо Берти.

1 Ответ

3 голосов
/ 26 сентября 2011

В последнее время я выполнил слишком много таких динамических запросов ... (мои столбцы смещаются от клиента к месяцу). Вот один из способов сделать это - без тестирования, без отладки, может быть несколько ошибок, чтобы сгладить:

DECLARE
  @Command     nvarchar(max)
 ,@ColumnList  nvarchar(max)
 ,@OrderId     int
 ,@Debug       bit


--  Build a comman-delimited list of the columns
SELECT @ColumnList = isnull(@ColumnLIst + ',', , '') + ColName
 from dbo.GetTableColumnNames('OrderCash', 2)


--  Insert the list of columns in two places in your query
SET @Command = replace('
SELECT  OrderID, 
        CurrCode + ‘‘GBP CURNCY’‘ AS Ticker, 
        Cash AS Position 
FROM 
( 
    SELECT OrderID, <@ColumnList>
    FROM OrderCash 
) p 
UNPIVOT 
( 
    Cash FOR CurrCode IN  
    (<@ColumnList>) 
) AS unpvt 
WHERE Cash != 0 
And OrderID = @OrderId
', '<@ColumnList>', @ColumnList)


--  Always include something like this!
IF @Debug = 1
    PRINT @Command

--  Using sp_executeSQL over EXECUTE (@Command) allows you execution
--  plan resuse with parameter passing (this is the part you may need
--  to debug on a bit, but it will work)
EXECUTE sp_executeSQL @Command, N'@OrderId int', @OrderId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...