की तरह अन्य लोगों ने कहा है, तो आप धुरी और UNPIVOT ऑपरेटरों का उपयोग कर सकते हैं। दुर्भाग्यवश, PIVOT और UNPIVOT दोनों की समस्याओं में से एक यह है कि आपको उन मूल्यों को जानने की आवश्यकता है जिन्हें आप अग्रिम रूप से पिवोट कर रहे हैं या अन्यथा गतिशील SQL का उपयोग करें।
ऐसा लगता है कि, आपके मामले में, आपको गतिशील एसक्यूएल का उपयोग करने की आवश्यकता होगी। यह अच्छी तरह से काम करने के लिए आपको अपनी क्वेरी में इस्तेमाल होने वाले उत्पादों की एक सूची खींचनी होगी। आप AdventureWorks डेटाबेस का उपयोग कर रहे थे, तो अपने कोड इस तरह दिखेगा:
USE AdventureWorks;
GO
DECLARE @columns NVARCHAR(MAX);
SELECT x.ProductName
INTO #products
FROM (SELECT p.[Name] AS ProductName
FROM Purchasing.Vendor AS v
INNER JOIN Purchasing.PurchaseOrderHeader AS poh ON v.VendorID = poh.VendorID
INNER JOIN Purchasing.PurchaseOrderDetail AS pod ON poh.PurchaseOrderID = pod.PurchaseOrderID
INNER JOIN Production.Product AS p ON pod.ProductID = p.ProductID
GROUP BY p.[Name]) AS x;
SELECT @columns = STUFF(
(SELECT ', ' + QUOTENAME(ProductName, '[') AS [text()]
FROM #products FOR XML PATH ('')
), 1, 1, '');
SELECT @columns;
अब कि आप अपने कॉलम है, तो आप सब कुछ है कि आप एक गतिशील क्वेरी के साथ पर पिवट जरूरत खींच कर सकते हैं:
DECLARE @sql NVARCHAR(MAX);
SET @sql = 'SELECT CustomerName, ' + @columns + '
FROM (
// your query goes here
) AS source
PIVOT (SUM(order_count) FOR product_name IN (' + @columns + ') AS p';
EXEC sp_executesql @sql
बेशक, अगर आपको यह सुनिश्चित करने की ज़रूरत है कि आपको सभ्य मूल्य मिलते हैं, तो आपको उस तर्क को डुप्लिकेट करना पड़ सकता है जिसका उपयोग आप @columns बनाने के लिए कर रहे हैं और एक @coalesceColumns वैरिएबल बना सकते हैं जो कोड को COALESCE (col_name, 0) पर रखेगा यदि आपको आवश्यकता हो आपकी क्वेरी में उस तरह की चीज।
स्रोत
2008-12-07 15:23:51