1. 程式人生 > >oracle的列轉行

oracle的列轉行

首先建立測試環境

 

create table test1(
user_account varchar2(100),
signup_date date,
user_email varchar2(100),
friend1_email varchar2(100),
friend2_email varchar2(100),
friend3_email varchar2(100)
);

insert into test1
values
  ('Rjbryla',
   to_date('2009-08-21', 'yyyy-mm-dd'),
   '[email protected]

',
   '[email protected]',
   '[email protected]',
   '[email protected]');

insert into test1
values
  ('johndoe',
   to_date('2009-08-22', 'yyyy-mm-dd'),
   '[email protected]',
   null,
   '[email protected]
',
   null);

--查詢表中的內容



   select user_account, signup_date, src_col_name, friend_email
  from test1 unpivot((friend_email) for src_col_name in(user_email,
                                                               friend1_email,
                                                               friend2_email,
                                                               friend3_email));

該語句的作用就是將列轉成行,src_col_name.friend_email是臨時變數,unpivot(聚合函式 for 列名 in(型別)) 是基本語法  ,其中 in(‘’) 中可以指定別名,in中還可以指定子查詢;該語句查詢出來的結果如下圖所示:

oracle11g之前的sql語句為:

select user_account,signup_date,'USER_EMAIL' as src_col_name,user_email as friend_email from test1
where user_email is not null
union
select user_account,signup_date,'FRIEND1_EMAIL' as src_col_name,user_email as friend_email from test1
where friend1_email is not null
union
select user_account,signup_date,'FRIEND2_EMAIL' as src_col_name,user_email as friend_email from test1
where friend2_email is not null
union
select user_account,signup_date,'FRIEND3_EMAIL' as src_col_name,user_email as friend_email from test1
where friend3_email is not null;