oracle 在多列上使用pivot

ycggw6v2  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(116)

我在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,如果有问题的话。

6l7fqoea

6l7fqoea1#

您可以使用ROW_NUMBER分析函数为每个人的工作编号,然后根据这些数字PIVOT

SELECT *
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY job_id) AS rn
  FROM   table_name t
)
PIVOT (
  MAX(job_id) AS job_id,
  MAX(salary) AS salary
  FOR rn IN (1 AS J1, 2 AS J2, 3 AS J3)
)

其中,对于样本数据:

CREATE TABLE table_name (person_id, job_id, salary) AS
SELECT 1, 50, 100 FROM DUAL UNION ALL
SELECT 1, 51, 125 FROM DUAL UNION ALL
SELECT 2, 51, 115 FROM DUAL UNION ALL
SELECT 2, 54, 105 FROM DUAL UNION ALL
SELECT 2, 55,  80 FROM DUAL;

输出:
| 个人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

相关问题