Трябва да знаете всички възможни стойности за 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;
За да направите това по-динамично, ще трябва да получите разделен със запетаи списък с ОТДЕЛНИ стойности на 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. Разбира се, това изглежда някак безполезно, защото, за да напишете този израз за вмъкване, трябва да знаете реда на колоните (което не е гарантирано с този подход) и трябва вече да сте поставили колони за всяка потенциална UBCategory стойност така или иначе, така че това изглежда много кокошка и яйце.