Oracle行列转置
2013-11-13 21:18
288 查看
情形一:1.创建测试表,并写入测试数据
2.bz1表示name为某值的共有的行数,如9091共有三行;bz2遍历bz1中的行数,如9091的bz2从1到3;v1、v2对应的是不同的值。
做查询将数据转为两行,代码如下:
上面代码没实现第二幅图所示效果:
8行最后转成两行。
情形:二:一个样品有多种属性值,而表中将一个样品的多个属性值存放成了多行,现在需要实现将一个样品属性值得多行数据显示为一行,而且这多个属性要按val2升序排列,只显示前三个val2属性。
用如下脚本创建表并写入测试数据:
第一步:
第二步:
第三步:
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;
相关文章推荐
- Oracle 行列转置
- Oracle 行列转置
- Oracle 行列转置
- Oracle 表格行列转置
- Oracle之行列转置
- 从Oracle 表格行列转置说起第1/2页
- oracle sql 行列转置
- 行列转置(Oracle)
- oracle 行列转置功能例子
- 从Oracle 表格行列转置说起第1/2页
- oracle行列转置
- 从Oracle表格行列转置说起...
- oracle中的行列转换(一 列转行 pivot)
- Oracle一个典型行列转换的几种实现方法
- CSS实现表格行列转置
- oracle行列互转常用小技巧总结
- Oracle 行列转换 总结
- mysql查缺补漏(三) count函数问题和行列转置
- 行列倒置(二)----交叉表(oracle)
- Oracle 11g 行列互换 pivot 和 unpivot 说明