首页 > 数据库 >Oracle 行转列的坑

Oracle 行转列的坑

时间:2022-12-02 22:38:18浏览次数:42  
标签:xh union 转列 dual bs Oracle allselect total


在使用Oracle的时候,有个需求需要将统计的数量关联别的表格联查出来,就想到了用行转列,搜了很多种方法,这里记录一下自己遇到的坑。

首先要确定一下自己使用的Oracle的版本:
因为:行转列:​​​PIVOT​​​ 列转行:​​UNPIVOT​​ 这两个是在Oracle11g上面新增的函数。Oracle10以及之前的版本是不支持这两个函数的。

查看Oracle版本:​​select * from v$version;​​​或者​​select banner from sys.v_$version;​

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

这里可以看到我用的是Oracle 10 具体的版本号为:​​10.2.0.1.0​​​   10:版本号
  2:新特性版本号
  0(第一个):维护版本号
  1(第二个):普通的补丁设置号码
  0:非凡的平台补丁设置号码

下面简单说下我的需求:
实际查询结果如下:

select '1100003000001' xh ,'1' bs,'20' total from dual union all
select '1100003000001' xh ,'0' bs,'6246' total from dual union all
select '1100003000002' xh ,'1' bs,'123' total from dual union all
select '1100003000002' xh ,'0' bs,'5000' total from dual

Oracle 行转列的坑_10g


这里我想以序号(​​xh​​​)这一列相同的给合并,并且把标识(​​bs​​​)字段的0和1对应的​​total​​改成在同一行以两个字段显示。

最后转换的效果:

Oracle 行转列的坑_列转行_02

with temp as (
select '1100003000001' xh ,'1' bs,'20' total from dual union all
select '1100003000001' xh ,'0' bs,'6246' total from dual union all
select '1100003000002' xh ,'1' bs,'123' total from dual union all
select '1100003000002' xh ,'0' bs,'5000' total from dual
)
select xh,
sum(decode(bs, '0', total, 0)) as dtotal,
sum(decode(bs, '1', total, 0)) as qtotal
from temp group by xh

可以看到这里使用了​​decode​​​函数,外面又套了一层​​sum​​函数,看着有点复杂了,一次查询使用了两次函数,目前数据量不大,不知道后面数据量大了影响大不大。。。。。。

那么要是去掉sum函数呢,查询会是什么样的看下:

with temp as (
select '1100003000001' xh ,'1' bs,'20' total from dual union all
select '1100003000001' xh ,'0' bs,'6246' total from dual union all
select '1100003000002' xh ,'1' bs,'123' total from dual union all
select '1100003000002' xh ,'0' bs,'5000' total from dual
)
select xh,
decode(bs, '0', total, 0) as dtotal,
decode(bs, '1', total, 0) as qtotal
from temp

Oracle 行转列的坑_Oracle_03


可见没有group by ,等于转换之后有两条数据,一条一个字段是0,另一个字段是total,但是行转列还是成功了,加上group by 才是我最终想要的结果

标签:xh,union,转列,dual,bs,Oracle,allselect,total
From: https://blog.51cto.com/linmengmeng/5907642

相关文章