sql-server - 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
我做了一些研究并在这里找到了一些有希望的东西,但没有帮助我。任何提示都会有所帮助!谢谢
解决方案
如果 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 子句必须是动态的。
推荐阅读
- c++ - C 或 C++ websocket 客户端工作示例
- reactjs - 如何平滑地重新渲染昂贵的组件
- c# - C# 通过 REST 接受 null 或字符串
- python - 未创建 Sanic/gunicorn 日志文件
- c# - Entity Framework Core - Union - 如何合并两个实体
- google-sheets - 不同列中唯一值的总和值(谷歌表格)
- google-sheets - 包含 Google Sheet 和 App Script 中字符的数字总和
- python - 在 Python 中旋转二维数组
- blazor - Blazor NavigationManager 不与 NavigateTo 一起使用
- bash - 运行 PowerShell 脚本并自动设置 Unrestricted 类似于 Bash shell hash bang