2008-12-07 73 views
8

查詢SQL Server 2005數據庫時遇到一個簡單問題。我有名爲客戶和產品(1-> M)的表格。一個客戶擁有最多2個產品。相反輸出如何將行轉換爲列

客戶名稱,產品名稱......

我喜歡爲

客戶名稱,Product1Name,Product2Name輸出...

任何人可以幫助我嗎?

謝謝!

回答

10

像其他人說的,你可以使用PIVOT和UNPIVOT運算符。不幸的是,對於PIVOT和UNPIVOT來說,問題之一就是你需要事先知道你將要旋轉的值,或者使用動態SQL。

聽起來就像你的情況,你將需要使用動態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

在SQL2005,有稱爲「軸」和可以使用的行和列之間變換「UNPIVOT」功能。

希望可以幫到你。

1

正如其他人所說,SQL 2005具有旋轉功能這也許是最適合一般用途。但是,在某些情況下,您可以簡單地做這樣的事情。

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