在使用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
这里我想以序号(xh
)这一列相同的给合并,并且把标识(bs
)字段的0和1对应的total
改成在同一行以两个字段显示。
最后转换的效果:
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
可见没有group by ,等于转换之后有两条数据,一条一个字段是0,另一个字段是total,但是行转列还是成功了,加上group by 才是我最终想要的结果
参考:
https://www.cnblogs.com/CryOnMyShoulder/p/7644697.html
https://www.cnblogs.com/xiao02fang/p/9705609.html