2008-12-07 20 views
8

SQL सर्वर 2005 डेटाबेस से पूछताछ करते समय मुझे एक साधारण समस्या है। मेरे पास ग्राहक और उत्पाद (1-> एम) नामक टेबल हैं। एक ग्राहक के पास 2 उत्पाद हैं।पंक्तियों को कॉलम में बदलने के लिए

CUSTOMERNAME, उत्पाद का नाम के रूप में उत्पादन ...

के बजाय मैं

CUSTOMERNAME, Product1Name, Product2Name के रूप में उत्पादन के लिए करना चाहते ...

किसी को भी मेरी मदद कर सकते हैं?

धन्यवाद!

उत्तर

10

की तरह अन्य लोगों ने कहा है, तो आप धुरी और 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) पर रखेगा यदि आपको आवश्यकता हो आपकी क्वेरी में उस तरह की चीज।

1

एसक्यूएल2005 में, "PIVOT" और "UNPIVOT" नामक फ़ंक्शन हैं जिनका उपयोग पंक्तियों और स्तंभों के बीच बदलने के लिए किया जा सकता है।

आशा है कि आपकी मदद कर सके।

1

जैसा कि अन्य ने उल्लेख किया है, SQL 2005 में PIVOT फ़ंक्शन है जो सामान्य उपयोग के लिए शायद सबसे अच्छा है। कुछ मामलों में, हालांकि, आप बस ऐसा कुछ कर सकते हैं।

Select 
Customer, 
Sum(Case When Product = 'Foo' Then 1 Else 0 End) Foo_Count, 
Sum(Case When Product = 'Bar' Then 1 Else 0 End) Bar_Count 
From Customers_Products 
Group By Customer 
संबंधित मुद्दे