SQL Server 旋转一列并保留其他列
Posted
技术标签:
【中文标题】SQL Server 旋转一列并保留其他列【英文标题】:SQL Server Pivot One Column and Keep Other Columns 【发布时间】:2020-09-02 19:55:06 【问题描述】:我正在尝试在 SQL Server 中旋转一个表(52M+ 观察),但是我没有得到我需要的结果。有 15 个描述,每个描述都有一个我需要调整的值。
原始数据框:
ID | Date | Description| Value
-------------------------------------------------
P1 | 2016-12-31 | ABC | 900
P2 | 2016-11-30 | XYZ | 800
P3 | 2016-10-31 | MNO | 700
期望的结果
ID | Date | ABC | XYZ | MNO
-------------------------------------------------
P1 | 2016-12-31 | 900 | |
P2 | 2016-11-30 | | 800 |
P3 | 2016-10-31 | | | 700
我尝试在 PySpark 和 SQL 中对此进行旋转,但没有得到有效的结果。
SQL 尝试:
SELECT [Date]
,[ID]
,[Description]
,[Value]
FROM [DB].[TABLE]
WHERE ( ([Description] IN ('ABC','XYZ', 'MNO'))
PIVOT(
COUNT([Value])
FOR Description IN (
[ABC],
[XYZ],
[MNO])
) AS pivot_table;
我在 Pyspark 中尝试过,但它也不起作用:
df.groupBy("ID","Date").pivot("Description").sum("Value")
【问题讨论】:
【参考方案1】:使用条件聚合:
select
id,
date,
max(case when description = 'ABC' then value end) as abc,
max(case when description = 'DEF' then value end) as def,
max(case when description = 'MNO' then value end) as mno
from mytable
group by id, date
【讨论】:
【参考方案2】:pivot 运算符紧跟在 FROM 子句中的表之后。要放置 WHERE 子句,您需要将数据透视源表放在子查询或公用表表达式中。
此外,您不能在外部选择中输出 Description 和 Value 列,因为它们现在按 Pivot 分组。
试试这个方法:
SELECT [Date],
[ID],
[ABC],
[XYZ],
[MNO]
FROM
(
SELECT [Date]
,[ID]
,[Description]
,[Value]
FROM [DB].[TABLE]
WHERE ([Description] IN ('ABC','XYZ', 'MNO'))
) AS SourceTable
PIVOT(
COUNT([Value])
FOR Description IN (
[ABC],
[XYZ],
[MNO])
) AS PivotTable;
【讨论】:
以上是关于SQL Server 旋转一列并保留其他列的主要内容,如果未能解决你的问题,请参考以下文章