ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle--行列转换

oracle--行列转换

原创 Linux操作系统 作者:jgsh_zy 时间:2011-07-28 14:36:55 0 删除 编辑

表结构: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博客 ” ,链接:http://blog.itpub.net/25845642/viewspace-703336/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2011-07-18

  • 博文量
    2
  • 访问量
    527