Anda perlu mengetahui semua nilai yang mungkin untuk PIVOT. Jadi sulit untuk melakukan ini dengan T-SQL secara langsung kecuali jika Anda menggunakan SQL dinamis dan ini bisa cepat berbulu. Mungkin lebih baik meneruskan semua baris kembali ke tingkat presentasi atau penulis laporan dan membiarkannya berbelok ke samping.
Berikut adalah contoh PIVOT cepat jika Anda mengetahui semua nilai UBCategory sebelumnya. Saya meninggalkan ICCUDays karena tampaknya agak tidak relevan kecuali ada kolom yang berasal dari pandangan itu sebagai bagian dari hasil.
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;
Untuk membuat ini lebih dinamis, Anda harus mendapatkan daftar nilai DISTINCT UBCategory yang dipisahkan koma, dan membangun pivot dengan cepat. Jadi mungkin terlihat seperti ini:
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;
Kemudian untuk "mengirim data ke tabel baru" Anda bisa membuat kueri menjadi INSERT INTO ... SELECT alih-alih SELECT langsung. Tentu saja, ini sepertinya tidak berguna, karena untuk menulis pernyataan penyisipan itu, Anda perlu mengetahui urutan kolom (yang tidak dijamin dengan pendekatan ini) dan Anda harus sudah memasukkan kolom untuk setiap potensi UBCategory nilai, jadi ini terlihat sangat ayam dan telur.