oracle怎么列转行 oracle的行转列和列转行

Oracle列转行,行转列oracle下可以用函数decode处理:
select 产品名称,
sum(decode(季度,'第一季度',销售额,0)) 第一季度销售额,
sum(decode(季度,'第二季度',销售额,0)) 第二季度销售额,
sum(decode(季度,'第三季度',销售额,0)) 第三季度销售额,
sum(decode(季度,'第四季度',销售额,0)) 第四季度销售额,
from 表名
group by 产品名称;
Oracle列转行的问题如果单纯是你表里数据的话:
创建表 , 数据
create table test
(key varchar2(20),
value varchar2(20));
insert into test values ('account','0001');
insert into test values ('name','张三');
insert into test values ('account','0002');
insert into test values ('name','李四');
commit;
执行:
select max(case
when t.key = 'account' then
value
end) account,
max(case
when t.key = 'name' then
value
end) name
from (select test.*, rownum rn from test) t
group by ceil(rn / 2)
结果:
我这里是强行把行号作为了分组条件,否则同样的0001账户也有可能对应上李四这个人,所以你最好自己弄清楚怎么才是一组,比如是一组的两条数据给个同样的ID之类的 。
Oracle列转行函数vm_concat在19C版本不兼容解决方案本文记录一下Oracle列转行函数在Oracle11的一些不兼容问题,vm_concat在一些业务场景是必须的 。不过这个函数使用要谨慎,底层实现应该也是group by等等实现的,性能并不是特别好 。这个函数在Oracle12C是没有的,在Oracle11是不太兼容的,Oracle10可以正常使用 。最近开发场景遇到这个问题 , 可以写到了自定义列转行函数的办法去解决 。但是这种办法并不一定适用所有的业务场景 。
解决方案
通过自定义函数解决也是可以的,不过我并不是这样做的 。下面介绍一下我的解决方法 。首先分析一下,Oracle19C不兼容vm_concat列转行函数,并不代表其它函数不兼容,或许可以找到其它代替的,通过找资料,发现了Oracle11提供的另外一个函数:listagg()函数 语法:listagg(参数,‘分隔符’) within group(order by 参数id),验证可以实现在19C正常使用
例如:
to_char(wm_concat(t.busi_id))
可以改写成:
to_char(listagg(t.busi_id,',' ) within GROUP (order by (t.busi_id)))
SQL如:
SELECT listagg(t.busi_id, ',') within GROUP(order by (t.busi_id))
FROM sys_cdc_sync_record t
WHERE cdc_sql_type = 'INSERT_SELECT'
oracle 列转行的问题 。图1是数据库查询的结果 图二是我想要的结果的格式,谢谢了 。如果你的列是固定的,无论多少行,都可以通过典型的case when语句来处理,由于你图1不太能看清,我们假设你想显示列名为typeid,值为1,3,4的分列统计信息,则SQL语句如下:
select orgid,
sum((case when typeid=1 then 1 else 0 end))as typeid1,
sum((case when typeid=3 then 1 else 0 end))as typeid3,
sum((case when typeid=4 then 1 else 0 end))as typeid4
from Table001 where 1=1
group by orgid
如能提供清晰的图1,我再写给你完全可执行的SQL
【oracle怎么列转行 oracle的行转列和列转行】oracle怎么列转行的介绍就聊到这里吧 , 感谢你花时间阅读本站内容,更多关于oracle的行转列和列转行、oracle怎么列转行的信息别忘了在本站进行查找喔 。

    推荐阅读