`
yesjavame
  • 浏览: 691776 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Oracle合并多行为多列

阅读更多

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和命名的列就不对应了.
分享到:
评论
1 楼 Tank03 2013-04-11  
select
  sum(decode(FEE_NAME, '租金(含中介及开票税金)', FEE_MONEY, 0)),
  sum(decode(FEE_NAME, '固定电话', FEE_MONEY, 0))
  from t_os_costing t
where t.group_id = '145' and t.costing_month = '2013-04'



这样不行么?

相关推荐

    oracle实现多行合并的方法

    在Oracle数据库中,有时我们需要将同一列中的多个行值合并为单行文本,这在处理汇总数据或报告时尤其有用。Oracle提供了一种方便的方法来实现这一目标,特别是在Oracle 10g及更高版本中引入的`WMSYS.WM_CONCAT`函数...

    oracle_hint教程汇总

    4. **optimizer_features_enable**:这个Hint可以用来回退到旧版本的优化器行为,以解决新版本优化器可能导致的问题。 5. **LEADING**:用于指定在连接操作中优先处理的表,有助于优化器选择最佳连接顺序。 6. **...

    oracle数据库中的锁机制

    Oracle数据库通过内部机制自动管理锁的获取和释放,但在高并发环境下,了解锁的行为和避免死锁对于优化应用程序性能至关重要。 #### 结论 理解Oracle数据库中的锁机制对于设计高性能、高可用性的应用系统至关重要...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:...

    oracle系统视图作用大全

    在Oracle数据库中,当进行跨多个数据库节点的事务处理时,这个视图可以用于追踪事务的状态和进度。 2. **DBA_2PC_PENDING**: 用于显示等待恢复的分布式事务的信息。这在故障恢复或诊断分布式事务问题时非常有用。 ...

    Oracle Plus便携式手册

    #### 七、合并数据(Oracle 9i) 该章节介绍了Oracle 9i中的MERGE语句,用于根据匹配条件更新或插入数据。包括: - MERGE语句的语法及其工作原理。 - 如何基于匹配条件来更新或插入记录。 - 使用MERGE语句时的注意...

    Oracle EBS开发文档(form, report)

    **Oracle E-Business Suite (EBS)** 是一套全面的企业资源规划(ERP)解决方案,它提供了涵盖财务、供应链管理、项目管理等多个领域的功能模块。EBS的核心优势在于其高度可定制性和扩展性,这使得企业可以根据自身...

    oracle索引使用样例

    ### Oracle索引使用样例详解 #### 一、索引并行创建 在Oracle数据库中,并行...通过这些示例,我们可以看到Oracle数据库中的索引管理是一个非常复杂且多方面的主题。正确地管理和优化索引对于提高查询性能至关重要。

    ORACLE存储过程性能优化技巧

    这些规则通常反映了SQL语句执行的一般行为模式,比如索引使用、表扫描等。 - **规则优先级**:RBO按照规则号的大小顺序来评估执行计划,规则号越小,认为执行效率越高。这种优化方式并不依赖成本函数或统计信息。 - ...

    oracle 常用sql语句和常见问题

    - **JOIN操作**:用于合并多个表的数据,如`INNER JOIN`、`LEFT JOIN`、`RIGHT JOIN`和`FULL JOIN`。 - **GROUP BY和HAVING**:用于数据分组和条件过滤,如`GROUP BY column1, column2 HAVING condition;`。 - **...

    Oracle数据库经典学习教程

    - 联合查询可以将多个查询结果合并成一个结果集。 - 分组查询用于按照某个或某些字段对数据进行分组统计。 - **本章总结** - 深入介绍了SQL的基础知识和Oracle中的数据操作方法。 - 通过大量的实例帮助读者掌握...

    oracle表分区详解【转】

    表分区是Oracle数据库提供的一种高级数据组织方式,它将一个大表分成多个逻辑上独立但物理上存储在一起的部分,每个部分称为一个分区。这样做可以提高数据管理的效率,加速查询性能,并优化维护操作,如备份、恢复和...

    oracle命令集.rar

    `WHERE`子句用于过滤结果,`GROUP BY`和`HAVING`用于分组和条件过滤,`JOIN`则用于合并多个表的数据。 对于数据的增删改,`INSERT INTO`用于插入新记录,`DELETE FROM`用于删除指定的记录,`UPDATE`则用于修改现有...

    oracle查询语句优化

    8. 适当使用索引合并(index skip scan),在多个索引上同时查询,提高效率。 9. 优化表的分区策略,根据数据分布和查询模式选择合适的分区方式。 10. 考虑使用并行查询,特别是处理大量数据时,可以显著提升处理...

    oracle知识

    连接查询是将多个表的数据合并在一起进行查询的技术。 #### 六、函数 这部分介绍了 Oracle 数据库中常用的函数。 ##### 6.1 字符函数 - `UPPER()`:转换为大写。 - `LOWER()`:转换为小写。 - `TRIM()`:去除...

    oracle 老方块免费试听课程教学聊天记录,供大家学习

    Oracle数据库在SQL优化方面有很多策略和技术,其中包括对函数的使用、索引的创建以及性能测试。在提供的聊天记录中,提到了几个关键知识点,我们将详细展开讨论。 1. **NVL与DECODE函数的性能差异**: NVL函数用于...

    Oracle EBS 开发笔记

    - **Report多数据源**:从多个数据源获取数据并合并生成单一报告。 - **查询视图无数据**:解决报告生成时数据缺失的问题。 - **Report数据域**:定义报告中数据展示的区域。 - **Report汇总项**:汇总数据,生成...

    oracle 资料

    在Oracle中,JOIN操作是连接不同表的关键技术,用于将多个表的数据合并成一个结果集。本篇文章将详细探讨Oracle中的JOIN操作,包括各种类型的JOIN以及它们的使用方式。 1. JOIN概述 在Oracle中,JOIN操作允许我们将...

    ORACLE+SQL性能调整

    27. **不明确的索引等级**:避免在多列索引中使用不明确的索引列。 28. **强制索引失效**:在某些特殊情况下,可能需要禁止 Oracle 使用特定索引。 29. **避免在索引列上使用计算**:计算会影响索引的使用,应尽...

Global site tag (gtag.js) - Google Analytics