查詢SQL Server 2005數據庫時遇到一個簡單問題。我有名爲客戶和產品(1-> M)的表格。一個客戶擁有最多2個產品。相反輸出如何將行轉換爲列
客戶名稱,產品名稱......
我喜歡爲
客戶名稱,Product1Name,Product2Name輸出...
任何人可以幫助我嗎?
謝謝!
查詢SQL Server 2005數據庫時遇到一個簡單問題。我有名爲客戶和產品(1-> M)的表格。一個客戶擁有最多2個產品。相反輸出如何將行轉換爲列
客戶名稱,產品名稱......
我喜歡爲
客戶名稱,Product1Name,Product2Name輸出...
任何人可以幫助我嗎?
謝謝!
像其他人說的,你可以使用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)在你的查詢中的那種事情。
在SQL2005,有稱爲「軸」和可以使用的行和列之間變換「UNPIVOT」功能。
希望可以幫到你。
正如其他人所說,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