当前位置:  开发笔记 > 编程语言 > 正文

如何将行转换为列

如何解决《如何将行转换为列》经验,为你挑选了2个好方法。

查询SQL Server 2005数据库时遇到一个简单的问题.我有一个名为Customer and Products(1-> M)的表.一个客户拥有最多2个产品.而不是输出

客户名称,产品名称......

我喜欢输出为

CustomerName,Product1Name,Product2Name ...

有人能帮助我吗?

谢谢!



1> Jeremiah Pes..:

像其他人所说,你可以使用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)你的查询中的那种东西.



2> mavera..:

这里有两个关于pivot的链接:

http://www.tsqltutorials.com/pivot.php

http://www.simple-talk.com/sql/t-sql-programming/creating-cross-tab-queries-and-pivot-tables-in-sql/

我用pivot解决了我的问题;)

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有