首页 > 解决方案 > SQL Server - 使用 PIVOT 关系运算符时如何处理重复的列名

问题描述

我有一个 Excel 文件作为我的数据源,如下所示:

ColumnName  |Value
----------------------------
OrderNumber |PO-000576632
OrderDate   |2018-09-16
Delivery    |2018-09-22
Currency    |USD
TotalValue  |8006.34
Seller      |SupplierName
GLN         |000098 --this value is dynamic
Buyer       |CustomerName
GLN         |001592 --this value is dynamic
DeliverTo   |DeliveryAddress
GLN         |5940477481122 --this value is dynamic

拥有此结构中的信息,进一步使用此信息的唯一方法SQL是使用PIVOT关系运算符。我设法以某种方式获得所需的输出,但由于有 3GLN列名称,我只能使用该列表中的第一个。有没有办法在使用它们之前重命名这些列PIVOT

陈述

SELECT
      OrderNumber, OrderDate, Delivery,
      Currency, TotalValue, Seller, GLN,
      Buyer, DeliverTo  
FROM
(
SELECT 
      value, columnname
FROM  MyTable
) MyTable
PIVOT
(
MAX(value)
FOR ColumnName IN(    OrderNumber, OrderDate, Delivery,
      Currency, TotalValue, Seller, GLN,
      Buyer, DeliverTo))
piv

我做了一些研究并在这里找到了一些有希望的东西,但没有帮助我。任何提示都会有所帮助!谢谢

标签: sql-server

解决方案


如果 GLN 列的数量是固定的 (3),您可以使用以下内容:

WITH Src AS
(
    SELECT * FROM (VALUES
    ('OrderNumber', 'PO-000576632'),
    ('OrderDate', '2018-09-16'),
    ('Delivery', '2018-09-22'),
    ('Currency', 'USD'),
    ('TotalValue', '8006.34'),
    ('Seller', 'SupplierName'),
    ('GLN', '000098'),
    ('Buyer', 'CustomerName'),
    ('GLN', '001592'),
    ('DeliverTo', 'DeliveryAddress'),
    ('GLN', '5940477481122')) T(ColumnName,Value)
), Renamed AS
(
    SELECT ColumnName+CASE WHEN N>1 THEN CAST(N as nvarchar(10)) ELSE '' END ColumnName, Value
    FROM (
        SELECT ColumnName,Value,ROW_NUMBER() OVER (PARTITION BY ColumnName ORDER BY (SELECT 1)) N
        FROM Src
    ) T
)
SELECT * FROM Renamed
PIVOT (MAX(value) FOR ColumnName IN(OrderNumber, OrderDate, Delivery, Currency, TotalValue, Seller, GLN, GLN2, GLN3, Buyer, DeliverTo)) piv

结果

OrderNumber     OrderDate       Delivery        Currency        TotalValue      Seller          GLN             GLN2            GLN3            Buyer           DeliverTo
--------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- ---------------
PO-000576632    2018-09-16      2018-09-22      USD             8006.34         SupplierName    5940477481122   000098          001592          CustomerName    DeliveryAddress

如果有无限的 GLN 值,则 PIVOT 子句必须是动态的。


推荐阅读