使用 oracle 将值作为具有相应值的行获取
Getting values as rows with its corresponding values using oracle
我在table中有如下数据
DEPTNO ENAME SALARY
------ ---------- ------
Developer SENIOR 100000
Developer JUNIOR 100000
Tester SENIOR 200000
Tester JUNIOR 100000
Architect SENIOR 300000
Architect JUNIOR 300000
我需要给他们看
Occupation Senior Sal Junior Sal
------ ---------- ------
Developer SENIOR JUNIOR
Developer 100000 100000
Tester SENIOR JUNIOR
Tester 200000 100000
Architect SENIOR JUNIOR
Architect 300000 300000
我对如何实现这个感到困惑
使用
- 解码
- ROW_NUMBER
- 联合所有
SELECT deptno,
senior_sal,
junior_sal,
row_number() over(partition BY deptno order by senior_sal DESC) rn
FROM
(SELECT A.deptno, A.salary senior_sal, b.salary junior_sal
FROM
(SELECT deptno, TO_CHAR(salary) salary FROM your_table WHERE ename = 'SENIOR'
) A,
(SELECT deptno, TO_CHAR(salary) salary FROM your_table WHERE ename = 'JUNIOR'
) b
WHERE A.deptno = b.deptno
UNION ALL
SELECT A.deptno, A.salary senior_sal, b.salary junior_sal
FROM
(SELECT deptno, DECODE(ename, 'SENIOR', 'SENIOR') salary FROM your_table
WHERE ename = 'SENIOR'
) A,
(SELECT deptno, DECODE(ename, 'JUNIOR', 'JUNIOR') salary FROM your_table
WHERE ename = 'JUNIOR'
) b
WHERE A.deptno = b.deptno
);
工作演示
在SQL*加上:
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 );
输出:
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>
您可以使用 LISTAGG.
WITH sample_data AS(
SELECT 'Developer' DEPTNO, 'SENIOR' ENAME, 100000 SALARY FROM dual UNION ALL
SELECT 'Developer' DEPTNO, 'JUNIOR' ENAME, 100000 SALARY FROM dual UNION ALL
SELECT 'Tester' DEPTNO, 'SENIOR' ENAME, 200000 SALARY FROM dual UNION ALL
SELECT 'Tester' DEPTNO, 'JUNIOR' ENAME, 100000 SALARY FROM dual UNION ALL
SELECT 'Architect' DEPTNO, 'SENIOR' ENAME, 300000 SALARY FROM dual UNION ALL
SELECT 'Architect' DEPTNO, 'JUNIOR' ENAME, 300000 SALARY FROM dual
)
SELECT occupation, SUBSTR(name_sal,1,INSTR(name_sal,',')-1) "Senior Sal", SUBSTR(name_sal,INSTR(name_sal,',')+1) "Junior Sal"
FROM
(
SELECT DEPTNO as occupation,LISTAGG (ename, ',') WITHIN GROUP (ORDER BY ename DESC) name_sal
FROM sample_data
GROUP BY DEPTNO
UNION
SELECT deptno as occupation,LISTAGG (salary, ',') WITHIN GROUP (ORDER BY ename DESC)
FROM sample_data
GROUP BY deptno
)
ORDER BY 1, 2 DESC
我在table中有如下数据
DEPTNO ENAME SALARY
------ ---------- ------
Developer SENIOR 100000
Developer JUNIOR 100000
Tester SENIOR 200000
Tester JUNIOR 100000
Architect SENIOR 300000
Architect JUNIOR 300000
我需要给他们看
Occupation Senior Sal Junior Sal
------ ---------- ------
Developer SENIOR JUNIOR
Developer 100000 100000
Tester SENIOR JUNIOR
Tester 200000 100000
Architect SENIOR JUNIOR
Architect 300000 300000
我对如何实现这个感到困惑
使用
- 解码
- ROW_NUMBER
- 联合所有
SELECT deptno, senior_sal, junior_sal, row_number() over(partition BY deptno order by senior_sal DESC) rn FROM (SELECT A.deptno, A.salary senior_sal, b.salary junior_sal FROM (SELECT deptno, TO_CHAR(salary) salary FROM your_table WHERE ename = 'SENIOR' ) A, (SELECT deptno, TO_CHAR(salary) salary FROM your_table WHERE ename = 'JUNIOR' ) b WHERE A.deptno = b.deptno UNION ALL SELECT A.deptno, A.salary senior_sal, b.salary junior_sal FROM (SELECT deptno, DECODE(ename, 'SENIOR', 'SENIOR') salary FROM your_table WHERE ename = 'SENIOR' ) A, (SELECT deptno, DECODE(ename, 'JUNIOR', 'JUNIOR') salary FROM your_table WHERE ename = 'JUNIOR' ) b WHERE A.deptno = b.deptno );
工作演示
在SQL*加上:
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 );
输出:
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>
您可以使用 LISTAGG.
WITH sample_data AS(
SELECT 'Developer' DEPTNO, 'SENIOR' ENAME, 100000 SALARY FROM dual UNION ALL
SELECT 'Developer' DEPTNO, 'JUNIOR' ENAME, 100000 SALARY FROM dual UNION ALL
SELECT 'Tester' DEPTNO, 'SENIOR' ENAME, 200000 SALARY FROM dual UNION ALL
SELECT 'Tester' DEPTNO, 'JUNIOR' ENAME, 100000 SALARY FROM dual UNION ALL
SELECT 'Architect' DEPTNO, 'SENIOR' ENAME, 300000 SALARY FROM dual UNION ALL
SELECT 'Architect' DEPTNO, 'JUNIOR' ENAME, 300000 SALARY FROM dual
)
SELECT occupation, SUBSTR(name_sal,1,INSTR(name_sal,',')-1) "Senior Sal", SUBSTR(name_sal,INSTR(name_sal,',')+1) "Junior Sal"
FROM
(
SELECT DEPTNO as occupation,LISTAGG (ename, ',') WITHIN GROUP (ORDER BY ename DESC) name_sal
FROM sample_data
GROUP BY DEPTNO
UNION
SELECT deptno as occupation,LISTAGG (salary, ',') WITHIN GROUP (ORDER BY ename DESC)
FROM sample_data
GROUP BY deptno
)
ORDER BY 1, 2 DESC