oracle 如何聚合多行函数
在BEA论坛上看一位"专家"写的大作,一条SQL语句是
select r.xm,
substr(r.csrq,1,4)||'年'||substr(r.csrq,5,2)||'月'||substr(r.csrq,7,2)||'日' csrq,
(select dictvalue from zh_dictvalue where dictcode=xb and dictname='rk_xb') xb,
(select dictvalue from zh_dictvalue where dictcode=mz and dictname='rk_mz') mz,
(select dictvalue from zh_dictvalue where dictcode=ssxq and dictname='rk_xzqh') ssxq,
xz,
xp,
xz,
fwcs
from czrk_jbxx r,rk_zpxx p
where r.gmsfhm=p.gmsfhm and rownum<2
朋友看了一会,然后问我 (select dictvalue from zh_dictvalue where dictcode=xb and dictname='rk_xb') xb, (select dictvalue from zh_dictvalue where dictcode=mz and dictname='rk_mz') mz, (select dictvalue from zh_dictvalue where dictcode=ssxq and dictname='rk_xzqh') ssxq, 这里如何优化,也就是符合条件的三条记录要合并成一条记录.
其实之前有好多这样的问题,但没有一个好的方案,都是嵌套太多,性能损失很大,把三条记录的结果合并.如果最后的sql语句中的select超过三次,那真的还不如直接这样查询.
不过首先这个方法是错误的,因为这三次都在原表中查询,性能损失很大,其实如果是5条,10条,20条,100条.这样的语句写起来就累死人了.
之前有人提供了几个方案,但都是连成字符串还不是形成多列.真正形成多列应该是用分析函数:
这样实际上只能原表做一次查询,然后得到的结果集在显示的时候被提前到一行上形成多列.
select * from (
select name,
lead(name,1) over (order by name) as name1,
lead(name,2) over (order by name) as name2,
lead(name,3) over (order by name) as name3,
lead(name,4) over (order by name) as name4
from tb_customer where 条件
) t
where t.name4 is not null
这样原来的行数越多节省的性能越高,因为实际原表查询只有一次,后来只是对内存中的结果做合并.上面的那个例子就是
select * from (
select dictvalue as mz,
lead(dictvalue,1) over (order by dictcode) as ssxq,
lead(dictvalue,2) over (order by dictcode) as xb,
from zh_dictvalue
where (dictcode=xb and dictname='rk_xb')
or (dictcode=mz and dictname='rk_mz')
or (dictcode=ssxq and dictname='rk_xzqh')
) t
where t.ssxq not null
注意在order by dictcode后,苛as后面的名称被调整了.否则dictvalue和命名的列就不对应了.
转载于:
http://yesjavame.iteye.com/blog/1061721
分享到:
相关推荐
oracle行转列
Oracle多行记录合并/连接/聚合字符串的几种方法
Oracle行转列 Oracle行转列是指在Oracle数据库中将行数据转换为列数据或将列数据转换为行数据的操作。这种操作在实际应用中非常有用,例如,在数据报表、数据分析和数据挖掘等领域都需要使用行转列操作。 1. 列...
NULL 博文链接:https://vernonchen163.iteye.com/blog/1902976
oracle行转列_列转行,实例加解析,自己测试没问题。免费分享了~
用存储过程写的动态行转列。简单易用,查询速度高效
oracle数据库最详细的行转列资料,是官方文档的详细介绍版,中文的
oracle的列转行问题 oracle的列转行问题
oracle 全文检索 oracle全文索引 多列字段检索,匹配多列字段搜索功能。
Oracle中使用语句将行数据转换称不同的列表示,或者将不同的列数据写到同一列的不同行上的行列转换问题是一个非常传统的话题。 网络上流传了很多将行数据转换称列数据的方法和应用实例,一般通过decode或者case函数...
oracle列转行的方法,有些时候页面显示要通过后台的列转行去实现,我们可以直接从sql中解决后台很复杂的问题
Oracle时间区间段合并统计的算法
oracle 行转列的sql语句写法, 附带例子
关于oracle数据库如何行转列SQL语句。
存在多张不同表空间,这时候需要把所有的表空间都合并成一个表空间
数据库 Mysql转oracle sql脚本转oracle脚本
理解日常工作中常用到的多列分组, 如【统计不同部门、 不同职位的平均工资】和 行转列 包含例子 和 个人理解分析
oracle实现行转列功能,并使用逗号进行隔开拼接,成为一条数据.pdf
SQL语句用with将列分割成多列存为临时表,再将多行某个字段拼接合并为一行