查询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