ORACLE行转列、列转行函数

行转列函数--pivot

创建所需表inp_bill_detail

create table inp_bill_detail(
patient_id varchar2(16) not null,
visit_id number(2) not null,
item_no number(6) not null,
item_code varchar2(20),
item_name varchar2(100)
);
comment on column inp_bill_detail.patient_id is '患者编号';
comment on column inp_bill_detail.visit_id is '就诊次数';
comment on column inp_bill_detail.item_no is '项目序号';
comment on column inp_bill_detail.item_code is '项目编号';
comment on column inp_bill_detail.item_name is '项目名称';
alter table inp_bill_detail add constraint pk_inp_bill_dettail primary key(patient_id,visit_id,item_no);

插入数据

insert into inp_bill_detail(patient_id,visit_id,item_no,item_code,item_name) values('19960509',1,1,'HL001','一级护理');
insert into inp_bill_detail(patient_id,visit_id,item_no,item_code,item_name) values('19960509',1,2,'HL001','一级护理');
insert into inp_bill_detail(patient_id,visit_id,item_no,item_code,item_name) values('19960509',1,3,'HL001','一级护理');
insert into inp_bill_detail(patient_id,visit_id,item_no,item_code,item_name) values('19960509',1,4,'HL002','二级护理');
insert into inp_bill_detail(patient_id,visit_id,item_no,item_code,item_name) values('19960509',1,5,'HL002','二级护理');
insert into inp_bill_detail(patient_id,visit_id,item_no,item_code,item_name) values('19960509',1,6,'HL002','二级护理');
insert into inp_bill_detail(patient_id,visit_id,item_no,item_code,item_name) values('19960509',1,7,'HL002','二级护理');
insert into inp_bill_detail(patient_id,visit_id,item_no,item_code,item_name) values('19960509',1,8,'HL003','三级护理');
insert into inp_bill_detail(patient_id,visit_id,item_no,item_code,item_name) values('19960509',1,9,'HL003','三级护理');
insert into inp_bill_detail(patient_id,visit_id,item_no,item_code,item_name) values('19960509',1,10,'HL003','三级护理');
insert into inp_bill_detail(patient_id,visit_id,item_no,item_code,item_name) values('19960509',1,11,'HL003','三级护理');
insert into inp_bill_detail(patient_id,visit_id,item_no,item_code,item_name) values('19960509',1,12,'HL003','三级护理');
insert into inp_bill_detail(patient_id,visit_id,item_no,item_code,item_name) values('19960509',1,13,'HL004','特级护理');
insert into inp_bill_detail(patient_id,visit_id,item_no,item_code,item_name) values('19960509',1,14,'HL004','特级护理');
insert into inp_bill_detail(patient_id,visit_id,item_no,item_code,item_name) values('19960509',1,15,'HL004','特级护理');
insert into inp_bill_detail(patient_id,visit_id,item_no,item_code,item_name) values('19960509',1,16,'HL004','特级护理');

查询患者各级护理的次数

select ibd.patient_id,ibd.visit_id,ibd.item_name,count(*) as sl from inp_bill_detail ibd group by ibd.patient_id,ibd.visit_id,ibd.item_name order by decode(ibd.item_name,'一级护理',1,'二级护理',2,'三级护理',3,4)

查询结果:

patient_idvisit_iditem_namesl
199605091一级护理3
199605091二级护理4
199605091三级护理5
199605091特级护理4

行转列

with aa as(
select ibd.patient_id,ibd.visit_id,ibd.item_name,count(*) as sl from inp_bill_detail ibd group by ibd.patient_id,ibd.visit_id,ibd.item_name order by decode(ibd.item_name,'一级护理',1,'二级护理',2,'三级护理',3,4)
)
select * from aa pivot(max(aa.sl) for aa.item_name in('一级护理' 一级护理,'二级护理' 二级护理,'三级护理' 三级护理,'特级护理' 特级护理))

查询结果

patient_idvisit_id一级护理二级护理三级护理特级护理
1996050913454

列转行函数–unpivot

创建表

create table lzh_temp as
with aa as(
select ibd.patient_id,ibd.visit_id,ibd.item_name,count(*) as sl from inp_bill_detail ibd group by ibd.patient_id,ibd.visit_id,ibd.item_name order by decode(ibd.item_name,'一级护理',1,'二级护理',2,'三级护理',3,4)
)
select * from aa pivot(max(aa.sl) for aa.item_name in('一级护理' 一级护理,'二级护理' 二级护理,'三级护理' 三级护理,'特级护理' 特级护理))

列转行

select * from lzh_temp unpivot(SL for NAME in(一级护理,二级护理,三级护理,特级护理))

查询结果

patient_idvisit_iditem_namesl
199605091一级护理3
199605091二级护理4
199605091三级护理5
199605091特级护理4

注意
列转行in()中填写的为列名,不得添加引号;SL,NAME为自定义列名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值