Вам необходимо знать все возможные значения PIVOT. Так что это трудно сделать с помощью T-SQL напрямую, если вы не используете динамический SQL, и это может стать довольно быстро. Вероятно, лучше передать все строки обратно на уровень представления или составителю отчетов и позволить им повернуть их вбок.
Вот быстрый пример PIVOT, если вы заранее знаете все значения UBCategory. Я пропустил ICCUDays, поскольку это кажется довольно неактуальным, если только в результате нет столбцов, которые исходят из этого представления.
USE tempdb;
GO
SET NOCOUNT ON;
GO
-- who on earth is responsible for your naming scheme?
CREATE TABLE dbo.ICCUEnctrSelectedRevCatsDirCost
(
Account INT,
UBCategory VARCHAR(10),
DirectCost DECIMAL(9,2)
);
INSERT dbo.ICCUEnctrSelectedRevCatsDirCost
SELECT 1, 'foo', 5.25
UNION SELECT 1, 'bar', 6.25
UNION SELECT 1, 'smudge', 8.50
UNION SELECT 2, 'foo', 9.25
UNION SELECT 2, 'brap', 2.75;
SELECT Account,[foo],[bar],[smudge],[brap] FROM
dbo.ICCUEnctrSelectedRevCatsDirCost
-- WHERE <something>, I assume ???
PIVOT
(
MAX(DirectCost)
FOR UBCategory IN ([foo],[bar],[smudge],[brap])
) AS p;
GO
DROP TABLE dbo.ICCUEnctrSelectedRevCatsDirCost;
Чтобы сделать это более динамичным, вам нужно получить разделенный запятыми список значений DISTINCT UBCategory и построить сводку на лету. Так это может выглядеть так:
USE tempdb;
GO
SET NOCOUNT ON;
GO
-- who on earth is responsible for your naming scheme?
CREATE TABLE dbo.ICCUEnctrSelectedRevCatsDirCost
(
Account INT,
UBCategory VARCHAR(10),
DirectCost DECIMAL(9,2)
);
INSERT dbo.ICCUEnctrSelectedRevCatsDirCost
SELECT 1, 'foo', 5.25
UNION SELECT 1, 'bar', 6.25
UNION SELECT 1, 'smudge', 8.50
UNION SELECT 2, 'foo', 9.25
UNION SELECT 2, 'brap', 2.75
UNION SELECT 3, 'bingo', 4.00;
DECLARE @sql NVARCHAR(MAX),
@col NVARCHAR(MAX);
SELECT @col = COALESCE(@col, '') + QUOTENAME(UBCategory) + ','
FROM
(
SELECT DISTINCT UBCategory
FROM dbo.ICCUEnctrSelectedRevCatsDirCost
) AS x;
SET @col = LEFT(@col, LEN(@col)-1);
SET @sql = N'SELECT Account, $col$ FROM
dbo.ICCUEnctrSelectedRevCatsDirCost
-- WHERE <something>, I assume ???
PIVOT
(
MAX(DirectCost)
FOR UBCategory IN ($col$)
) AS p;';
SET @sql = REPLACE(@sql, '$col$', @col);
--EXEC sp_executeSQL @sql;
PRINT @sql;
GO
DROP TABLE dbo.ICCUEnctrSelectedRevCatsDirCost;
Затем, чтобы «отправить данные в новую таблицу», вы можете просто сделать запрос INSERT INTO ... SELECT вместо прямого SELECT. Конечно, это кажется бесполезным, потому что для написания этого оператора вставки необходимо знать порядок столбцов (что не гарантируется при таком подходе), и вы должны уже вставить столбцы для каждой потенциальной категории UBC значение в любом случае, так что это кажется очень курица и яйцо.