आपको PIVOT द्वारा सभी संभावित मानों को जानना होगा। इसलिए इसे सीधे टी-एसक्यूएल के साथ करना मुश्किल है जब तक कि आप डायनेमिक एसक्यूएल का उपयोग नहीं करते हैं और यह बहुत जल्दी बालों वाला हो सकता है। शायद सभी पंक्तियों को प्रस्तुतिकरण स्तर या रिपोर्ट लेखक को पास करना और उन्हें एक तरफ मोड़ने देना बेहतर है।
यदि आप सभी UBCategory मानों को पहले से जानते हैं, तो यहां एक त्वरित PIVOT उदाहरण दिया गया है। मैंने 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 बना सकते हैं ... सीधे चयन के बजाय चयन करें। बेशक, यह एक तरह से बेकार लगता है, क्योंकि उस इंसर्ट स्टेटमेंट को लिखने के लिए, आपको कॉलम के क्रम को जानना होगा (जो इस दृष्टिकोण से गारंटीकृत नहीं है) और आपको पहले से ही प्रत्येक संभावित UBCategory के लिए कॉलम डालने की आवश्यकता है। वैसे भी मूल्य, तो यह बहुत चिकन और अंडा लगता है।