oracle行转列/列转行/字符串拆分 测试

Posted 刘强

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle行转列/列转行/字符串拆分 测试相关的知识,希望对你有一定的参考价值。

 
--列转行
 --示例1
select * from (
select o.sname, count(1) dataNum
  from t_Olm_Onlinemondata d
  join t_Aaa_ou o on o.ou_id = d.company_id
 where d.mon_time > to_date(‘2019-11-01 00:00:00‘, ‘yyyy-mm-dd hh24:mi:ss‘)
 group by o.sname
 ) pivot( sum(dataNum) for sname in(‘石家庄炼化‘,‘燕山石化‘,‘安庆石化‘,‘天津石化‘,‘河南油田‘,‘湖北化肥‘,‘扬子石化‘,‘金陵石化‘,‘茂名石化‘ ))
--示例2
create table demo(id int,name varchar(20),nums int);  ---- 创建表
insert into demo values(1, ‘苹果‘, 1000);
insert into demo values(2, ‘苹果‘, 2000);
insert into demo values(3, ‘苹果‘, 4000);
insert into demo values(4, ‘橘子‘, 5000);
insert into demo values(5, ‘橘子‘, 3000);
insert into demo values(6, ‘葡萄‘, 3500);
insert into demo values(7, ‘芒果‘, 4200);
insert into demo values(8, ‘芒果‘, 5500);

select *
  from (select name, sum(nums) nums from demo t group by t.name)
pivot(sum(nums)
   for name in(‘苹果‘, ‘橘子‘, ‘葡萄‘, ‘芒果‘))


--行转列
create table Fruit(id int,name varchar(20), Q1 int, Q2 int, Q3 int, Q4 int);
insert into Fruit values(1,‘苹果‘,1000,2000,3300,5000);
insert into Fruit values(2,‘橘子‘,3000,3000,3200,1500);
insert into Fruit values(3,‘香蕉‘,2500,3500,2200,2500);
insert into Fruit values(4,‘葡萄‘,1500,2500,1200,3500);
select * from Fruit;
select * from Fruit unpivot(
xiaoshou --行转列  列别名 新列名
for jidu --行转列  给转换的列起的 列别名
  in(Q1, Q2, Q3, Q4)
  )
--下面的语句执行错误 行转列 pivot和列转行unpivot的in只能使用静态字符串(http://www.oracle-developer.net/display.php?id=506)
with b as(
 select listagg(o.sname,‘,‘) within group(order by o.ou_id) sname from T_AAA_ou o where o.parent_id is null and o.enabled =1 and o.type=1
)
select * from (
select o.sname, count(1) dataNum
  from t_Olm_Onlinemondata d
  join t_Aaa_ou o on o.ou_id = d.company_id
 where d.mon_time > to_date(‘2019-11-01 00:00:00‘, ‘yyyy-mm-dd hh24:mi:ss‘)
 group by o.sname
 ) pivot( sum(dataNum) for sname in( b  ));
--字符串拼接 listagg within group (order by o.ou_id) 
 select listagg(o.sname, ‘,‘) within group(order by o.ou_id) sname
   from T_AAA_ou o
  where 1=1
    and o.parent_id is null
    and o.enabled = 1
    and o.type = 1
  group by o.parent_id;
  
--字符串拆分
drop table Fruit;
create table Fruit(id int,name varchar(50), Q1 int, Q2 int, Q3 int, Q4 int);
insert into Fruit values(1,‘苹果,香瓜,哈密瓜,梨‘,1000,2000,3300,5000);
insert into Fruit values(2,‘橘子,葡萄,荔枝,榴莲‘,3000,3000,3200,1500);
insert into Fruit values(3,‘香蕉,雪莲果,山竹,樱桃‘,2500,3500,2200,2500);
insert into Fruit values(4,‘葡萄,芒果,沙棘,无花果‘,1500,2500,1200,3500);
select* from Fruit
select
  (select max( regexp_substr(Fruit.Name,‘[^,]+‘,1,level,‘i‘)) from dual connect by level <= length(Fruit.Name)-length(regexp_replace(‘,‘,‘‘)))names
 from Fruit
 
 
select t.name from Fruit t inner join a on a.name = t.name;

--获取字符串长度
select LENGTH(‘17,20,23‘) from dual;
--获取没有逗号的字符串长度

select LENGTH(REGEXP_REPLACE(‘17,20,23‘, ‘,‘, ‘‘)) from dual;
SELECT LEVEL FROM DUAL CONNECT BY LEVEL <=7;
SELECT NVL(REGEXP_SUBSTR(‘17,20,23‘, ‘[^,]+‘, 1, LEVEL, ‘i‘), ‘NULLL‘) AS STR
FROM DUAL
CONNECT BY LEVEL<= LENGTH(‘17,20,23‘) - LENGTH(REGEXP_REPLACE(‘17,20,23‘, ‘,‘, ‘‘))+1;
-- 字符串拆分  参考网址 http://blog.sina.com.cn/s/blog_679e928c0102wij3.html
--listagg(字段,‘,‘) within group(order by 分组字段)

 

以上是关于oracle行转列/列转行/字符串拆分 测试的主要内容,如果未能解决你的问题,请参考以下文章

oracle行转列,列转行

Oracle——行转列与列转行

Hive 行转列 & 列转行

【求助】有关oracle 动态行转列

Oracle列转行,行转列

SAS行转列&&列转行