Я разработал способ поворота строки из таблицы с помощью 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?
Любая помощь будет высоко ценится.
Большое спасибо
Берти.