您的位置:首页 > 数据库 > Oracle

Oracle行列转置

2013-11-13 21:18 288 查看
情形一:1.创建测试表,并写入测试数据

create table TEST
(
id   NUMBER not null,
bz1  NVARCHAR2(10),
bz2  NVARCHAR2(10),
v1   NVARCHAR2(30),
v2   NVARCHAR2(30),
name VARCHAR2(30)
)
insert into TEST (id, bz1, bz2, v1, v2, name)
values (1, '3', '1', 'MMN', 'QQ', '9091');
insert into TEST (id, bz1, bz2, v1, v2, name)
values (2, '3', '2', 'NB', 'AA', '9091');
insert into TEST (id, bz1, bz2, v1, v2, name)
values (3, '3', '3', 'VB', 'WW', '9091');
insert into TEST (id, bz1, bz2, v1, v2, name)
values (4, '5', '1', 'XX', 'EE', '9999');
insert into TEST (id, bz1, bz2, v1, v2, name)
values (5, '5', '2', 'ZZ', 'RR', '9999');
insert into TEST (id, bz1, bz2, v1, v2, name)
values (6, '5', '3', 'VV', 'TT', '9999');
insert into TEST (id, bz1, bz2, v1, v2, name)
values (7, '5', '4', 'GG', 'YY', '9999');
insert into TEST (id, bz1, bz2, v1, v2, name)
values (8, '5', '5', 'HYT', 'UU', '9999');
commit;

2.bz1表示name为某值的共有的行数,如9091共有三行;bz2遍历bz1中的行数,如9091的bz2从1到3;v1、v2对应的是不同的值。

做查询将数据转为两行,代码如下:

SELECT t.name,MAX(t.bz1),MAX(t.bz2),MAX(decode(t.bz2,1,t.v1,NULL)),
MAX(decode(t.bz2,1,t.v2,NULL)),
MAX(decode(t.bz2,2,t.v1,NULL)),
MAX(decode(t.bz2,2,t.v2,NULL)),
MAX(decode(t.bz2,3,t.v1,NULL)),
MAX(decode(t.bz2,3,t.v2,NULL)),
MAX(decode(t.bz2,4,t.v1,NULL)),
MAX(decode(t.bz2,4,t.v2,NULL)),
MAX(decode(t.bz2,5,t.v1,NULL)),
MAX(decode(t.bz2,5,t.v2,NULL))
FROM test t
GROUP BY t.name;

上面代码没实现第二幅图所示效果:

SELECT t.name,t.bz1,
MAX(decode(t.bz2,1,t.bz2,NULL)),
MAX(decode(t.bz2,1,t.v1,NULL)),
MAX(decode(t.bz2,1,t.v2,NULL)),
MAX(decode(t.bz2,2,t.bz2,NULL)),
MAX(decode(t.bz2,2,t.v1,NULL)),
MAX(decode(t.bz2,2,t.v2,NULL)),
MAX(decode(t.bz2,3,t.bz2,NULL)),
MAX(decode(t.bz2,3,t.v1,NULL)),
MAX(decode(t.bz2,3,t.v2,NULL)),
MAX(decode(t.bz2,4,t.bz2,NULL)),
MAX(decode(t.bz2,4,t.v1,NULL)),
MAX(decode(t.bz2,4,t.v2,NULL)),
MAX(decode(t.bz2,5,t.bz2,NULL)),
MAX(decode(t.bz2,5,t.v1,NULL)),
MAX(decode(t.bz2,5,t.v2,NULL))
FROM test t
GROUP BY t.name,t.bz1






8行最后转成两行。

情形:二:一个样品有多种属性值,而表中将一个样品的多个属性值存放成了多行,现在需要实现将一个样品属性值得多行数据显示为一行,而且这多个属性要按val2升序排列,只显示前三个val2属性。

用如下脚本创建表并写入测试数据:

-- Create table
create table TEST1
(
me_id  VARCHAR2(20 CHAR) not null,
lfd_nr NUMBER(4) not null,
val1   VARCHAR2(20 CHAR),
val2   VARCHAR2(20 CHAR),
val3   VARCHAR2(20 CHAR),
val4   VARCHAR2(20 CHAR),
val5   VARCHAR2(20 CHAR)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
-- Create/Recreate primary, unique and foreign key constraints
alter table TEST1
add constraint PKTEST1 primary key (ME_ID, LFD_NR)
using index
tablespace USERS
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);

insert into TEST1 (ME_ID, LFD_NR, VAL1, VAL2, VAL3, VAL4, VAL5)
values ('19202', 1, 'BMCC', 'A', '101', '1234', '88888');

insert into TEST1 (ME_ID, LFD_NR, VAL1, VAL2, VAL3, VAL4, VAL5)
values ('19202', 2, 'JGBJ', 'B', '102', '2345', '99999');

insert into TEST1 (ME_ID, LFD_NR, VAL1, VAL2, VAL3, VAL4, VAL5)
values ('20131', 1, 'RZW', 'C', '333', '5678', '77777');

insert into TEST1 (ME_ID, LFD_NR, VAL1, VAL2, VAL3, VAL4, VAL5)
values ('20131', 2, 'JGBJ', 'D', '555', '6789', '66666');

insert into TEST1 (ME_ID, LFD_NR, VAL1, VAL2, VAL3, VAL4, VAL5)
values ('20131', 3, 'BMCC', 'E', '777', '9012', '55555');

insert into TEST1 (ME_ID, LFD_NR, VAL1, VAL2, VAL3, VAL4, VAL5)
values ('20131', 4, 'YHEN', 'F', '999', '6578', '44444');

insert into TEST1 (ME_ID, LFD_NR, VAL1, VAL2, VAL3, VAL4, VAL5)
values ('20131', 5, 'YRU', 'G', '000', '9876', '33333');


第一步:

select an.*,row_number() over(partition by me_id order by val2 asc) rn
from (select t.me_id,t.lfd_nr,t.val1,t.val2,t.val3,t.val4,t.val5 from TEST1 t) an

第二步:

select temp.me_id,
decode(temp.rn,1,val1) as a_val1,
decode(temp.rn,1,val2) as a_val2,
decode(temp.rn,1,val3) as a_val3,
decode(temp.rn,2,val1) as b_val1,
decode(temp.rn,2,val2) as b_val2,
decode(temp.rn,2,val3) as b_val3,
decode(temp.rn,3,val1) as c_val1,
decode(temp.rn,3,val2) as c_val2,
decode(temp.rn,3,val3) as c_val3
from(select an.*,row_number() over(partition by me_id order by val2 asc) rn from (select t.me_id,t.lfd_nr,t.val1,t.val2,t.val3,t.val4,t.val5 from TEST1 t) an) temp


第三步:

select temp1.me_id,max(temp1.a_val1) as a1_val1,max(temp1.a_val2) as a1_val2,max(temp1.a_val3) as a1_val3,
max(temp1.b_val1) as a2_val1,max(temp1.b_val2) as a2_val2,max(temp1.b_val3) as a2_val3,
max(temp1.c_val1) as a3_val1,max(temp1.c_val2) as a3_val2,max(temp1.c_val3) as a3_val3
from(select temp.me_id,
decode(temp.rn,1,val1) as a_val1,
decode(temp.rn,1,val2) as a_val2,
decode(temp.rn,1,val3) as a_val3,
decode(temp.rn,2,val1) as b_val1,
decode(temp.rn,2,val2) as b_val2,
decode(temp.rn,2,val3) as b_val3,
decode(temp.rn,3,val1) as c_val1,
decode(temp.rn,3,val2) as c_val2,
decode(temp.rn,3,val3) as c_val3
from(select an.*,row_number() over(partition by me_id order by val2 asc) rn from (select t.me_id,t.lfd_nr,t.val1,t.val2,t.val3,t.val4,t.val5 from TEST1 t) an) temp) temp1
group by temp1.me_id;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: