SQL Pivot - 查询结果垂直到水平

Posted

技术标签:

【中文标题】SQL Pivot - 查询结果垂直到水平【英文标题】:SQL Pivot - Query Result vertical to horizontal 【发布时间】:2021-04-06 17:53:18 【问题描述】:

问题描述:

我有一个当前三行的表(例如)。目标是有一个选择,最终会带给我employee_id、val_x、val_y,而x 和y 取决于month_nr:

CREATE TABLE test(
  employee_id      NUMBER
 ,month_nr         NUMBER
 ,val              NUMBER
);

insert into test values (5,1,15);

insert into test values (15,1,60);

insert into test values (5,2,20);

基本上结果应该是这样的:

Employee ID Val Seq 1 Val Seq 2
5 15 20
15 60 null

是否需要枢轴 SQL 或是否有其他优雅的方法来解决此请求?枢轴 SQL 的外观如何?

感谢您的帮助!

【问题讨论】:

【参考方案1】:

我可能会选择pivot,除非您碰巧需要支持真正旧版本的 Oracle。但是你也可以用条件聚合做一些老派的事情

select employee_id,
       max( case when month_nr = 1 then val else null end ) val_1,
       max( case when month_nr = 2 then val else null end ) val_2
  from test
 group by employee_id

【讨论】:

感谢贾斯汀,您的“旧”解决方案运行良好。然而,我仍然会选择“pivot”版本,因为我不必支持旧的 Oracle 版本。【参考方案2】:

使用PIVOT

SELECT *
FROM   test
PIVOT (
  MAX( val )
  FOR month_nr IN (
    1 AS Val_Seq_1,
    2 AS Val_Seq_2
  )
)
ORDER BY employee_id;

哪些输出:

员工 ID | VAL_SEQ_1 | VAL_SEQ_2 ----------: | --------: | --------: 5 | 15 | 20 15 | 60 |

db小提琴here

【讨论】:

非常感谢您的完美回答@MT0!反响很好!

以上是关于SQL Pivot - 查询结果垂直到水平的主要内容,如果未能解决你的问题,请参考以下文章

Sql Pivot:垂直显示字段

用SQL查询创建水平垂直直方图

SQL 中的 Pivot 语法错误,为啥我得到不正确的结果?

SQL Pivot 未对所有结果求和

SQL Server Management Studio中的垂直选项卡 - 并排查询和结果?

Sql PIVOT,如何使用 PIVOT 将结果中的 NULL 转换为值 0