首页 > Linux操作系统 > Linux操作系统 > oracle--行列转换
表结构:create table EMP
(
EMP_NO VARCHAR2(20),
MONTH_1 NUMBER(10),
MONTH_2 NUMBER(10),
MONTH_3 NUMBER(10),
MONTH_4 NUMBER(10),
MONTH_5 NUMBER(10),
MONTH_6 NUMBER(10)
)
--列转行
数据:
| EMP_NO | MONTH_1 | MONTH_2 | MONTH_3 | MONTH_4 | MONTH_5 | MONTH_6 |
| A01 | 55646 | 5646 | 9789 | 1323 | 5465 | 6547 |
| A02 | 4487 | 5664 | 2132 | 7997 | 6565 | |
| A03 | 46546 | 4648 | 78979 | 54564 | 32154 | 6789 |
需得到的数据:
| emp_no | year_month | sal |
| A01 | 1月 | 55646 |
| A01 | 2月 | 5646 |
| A01 | 3月 | 9789 |
| A01 | 4月 | 1323 |
| A01 | 5月 | 5465 |
| A01 | 6月 | 6547 |
| A02 | 1月 | 4487 |
| A02 | 2月 | 5664 |
| A02 | 4月 | 2132 |
| A02 | 5月 | 7997 |
| A02 | 6月 | 6565 |
| A03 | 1月 | 46546 |
| A03 | 2月 | 4648 |
| A03 | 3月 | 78979 |
| A03 | 4月 | 54564 |
| A03 | 5月 | 32154 |
| A03 | 6月 | 6789 |
方法一:利用unpivot 适用oracle 11g
SELECT emp_no,TYPE AS year_month,sal
FROM emp
unpivot(sal FOR TYPE IN(month_1 AS '1月',month_2 AS '2月',month_3 AS '3月',
month_4 AS '4月',month_5 AS '5月',month_6 AS '6月'))
方法二:利用union all 适用oracle 8i以后(这个不是太清楚
)
SELECT emp_no,'1月',month_1 sal
FROM emp
UNION ALL
SELECT emp_no,'2月',month_2 sal
FROM emp
UNION ALL
SELECT emp_no,'3月',month_3 sal
FROM emp
UNION ALL
SELECT emp_no,'4月',month_4 sal
FROM emp
UNION ALL
SELECT emp_no,'5月',month_5 sal
FROM emp
UNION ALL
SELECT emp_no,'6月',month_6 sal
FROM emp
若要去除空额 则 加上条件 where sal is not null 即可。如果列很多的话 ,就比较麻烦了
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25845642/viewspace-703336/ ,如需转载,请注明出处,否则将追究法律责任。