我在Oracle表(tab 1)中有以下示例数据,我正在尝试将行转换为列。使用透视表,我可以像预期的那样拥有person_id,但在列中,我只能实现在不同的列中拥有每个job_id,并在行中拥有薪水。有可能把它做成我需要的形状吗?
样本数据:
| 人员标识|作业ID|工资|
| --|--|--|
| 1 | 50 | 100 |
| 1 | 51 | 125 |
| 2 | 51 | 115 |
| 2 | 54 | 105 |
| 2 | 55 | 80 |
我的预期输出:
| 人员标识|job_1|工资_1|工作_2|工资_2|工作_3|工资_3|
| --|--|--|--|--|--|--|
| 1 | 50 | 100 | 51 | 125 |null| null|
| 2 | 51 | 115 | 54 | 105 | 55 | 80 |
我试着使用pivot,因为在这里我发现了类似的问题:https://stewashton.wordpress.com/2018/05/28/generic-pivot-function/
Using pivot on multiple columns of an Oracle row
因为这是不完全相同的,我坚持尝试试错以及搜索谷歌类似的问题,但我找不到任何。
SQL Pivot on multiple columns with INT and NVARCHAR datatypes-这里最好的答案可以帮助我,但我不能在不同的列中有每个job_id,因为有大约1000个不同的工作,每个人都有2-5个工作。这意味着我最多可以有5*2+1列。
我用的是Oracle 19,如果有问题的话。
1条答案
按热度按时间6l7fqoea1#
您可以使用
ROW_NUMBER
分析函数为每个人的工作编号,然后根据这些数字PIVOT
:其中,对于样本数据:
输出:
| 个人ID| J1_JOB_ID| J1_薪资|J2_JOB_ID| J2_薪资|J3_JOB_ID| J3_薪资|
| --|--|--|--|--|--|--|
| 1 | 50 | 100 | 51 | 125 |* 空 | 空 *|
| 2 | 51 | 115 | 54 | 105 | 55 | 80 |
SELECT person_id, j1_job_id AS job_1, ...
。*fiddle