使用 oracle 获取值作为行及其对应的值

5 sql oracle rows multiple-columns

我有表中的数据如下

DEPTNO ENAME       SALARY
------ ----------  ------
Developer SENIOR       100000
Developer JUNIOR       100000
Tester    SENIOR       200000
Tester    JUNIOR       100000
Architect SENIOR       300000
Architect JUNIOR       300000
Run Code Online (Sandbox Code Playgroud)

我需要向他们展示

Occupation Senior Sal  Junior Sal
------ ----------      ------
Developer SENIOR       JUNIOR
Developer 100000       100000
Tester    SENIOR       JUNIOR
Tester    200000       100000
Architect SENIOR       JUNIOR
Architect 300000       300000
Run Code Online (Sandbox Code Playgroud)

我坚持这个如何实现这一目标

Lal*_*r B 3

使用

  • 解码
  • ROW_NUMBER
  • 联合所有
选择部门号,
  高级_萨尔,
  初级_萨尔,
  row_number() over(partition BY deptno order bysenior_sal DESC) rn
从
  (SELECT A.deptno, A.salarysenior_sal, b.salaryjunior_sal
  从
    (SELECT deptno, TO_CHAR(salary) 工资 FROM your_table WHERE ename = 'SENIOR'
    ) A,
    (SELECT deptno, TO_CHAR(salary) 工资 FROM your_table WHERE ename = 'JUNIOR'
    ) b
  其中 A.deptno = b.deptno
  联合所有
  SELECT A.deptno,A.salarysenior_sal,b.salaryjunior_sal
  从
    (SELECT deptno, DECODE(ename, 'SENIOR', 'SENIOR') 工资 FROM your_table
    WHERE ename = '高级'
    ) A,
    (SELECT deptno, DECODE(ename, 'JUNIOR', 'JUNIOR') 工资 FROM your_table
    WHERE ename = 'JUNIOR'
    ) b
  其中 A.deptno = b.deptno
  );

工作演示

在 SQL*Plus 中:

SQL> column rn noprint
SQL> WITH sample_data AS(
  2  SELECT 'Developer' DEPTNO, 'SENIOR' ENAME, 100000 SALARY FROM dual UNION ALL
  3  SELECT 'Developer' DEPTNO, 'JUNIOR' ENAME, 100000 SALARY FROM dual UNION ALL
  4  SELECT 'Tester' DEPTNO,    'SENIOR' ENAME, 200000 SALARY FROM dual UNION ALL
  5  SELECT 'Tester' DEPTNO,    'JUNIOR' ENAME, 100000 SALARY FROM dual UNION ALL
  6  SELECT 'Architect' DEPTNO, 'SENIOR' ENAME, 300000 SALARY FROM dual UNION ALL
  7  SELECT 'Architect' DEPTNO, 'JUNIOR' ENAME, 300000 SALARY FROM dual
  8  )
  9  -- end of sample_data mimicking real table
 10  SELECT deptno,
 11    senior_sal,
 12    junior_sal,
 13    row_number() over(partition BY deptno order by senior_sal DESC) rn
 14  FROM
 15    (SELECT A.deptno, A.salary senior_sal, b.salary junior_sal
 16    FROM
 17      (SELECT deptno, TO_CHAR(salary) salary FROM sample_data WHERE ename = 'SENIOR'
 18      ) A,
 19      (SELECT deptno, TO_CHAR(salary) salary FROM sample_data WHERE ename = 'JUNIOR'
 20      ) b
 21    WHERE A.deptno = b.deptno
 22    UNION ALL
 23    SELECT A.deptno, A.salary senior_sal, b.salary junior_sal
 24    FROM
 25      (SELECT deptno, DECODE(ename, 'SENIOR', 'SENIOR') salary FROM sample_data
 26      WHERE ename = 'SENIOR'
 27      ) A,
 28      (SELECT deptno, DECODE(ename, 'JUNIOR', 'JUNIOR') salary FROM sample_data
 29      WHERE ename = 'JUNIOR'
 30      ) b
 31    WHERE A.deptno = b.deptno
 32    );
Run Code Online (Sandbox Code Playgroud)

输出

DEPTNO          SENIOR_SAL      JUNIOR_SAL
--------------- --------------- ---------------
Architect       SENIOR          JUNIOR
Architect       300000          300000
Developer       SENIOR          JUNIOR
Developer       100000          100000
Tester          SENIOR          JUNIOR
Tester          200000          100000

6 rows selected.

SQL>
Run Code Online (Sandbox Code Playgroud)