今天在做项目,讲mysql项目转换为oracle项目的时候,发现某些sql语句不兼容
mysql语句如下
SELECT COLUMN1, group_concat(SHOUYILV ORDER BY CRETE_DATE) AS SHOUYILV FROM RCONFIGDATA WHERE column2 = '1' GROUP BY COLUMN1 ORDER BY COLUMN1
发现上面语句在oracle下不识别group_concat函数,因此需要进行转换,转换语句如下
SELECT COLUMN1,listagg(SHOUYILV,',') WITHIN GROUP(ORDER BY CRETE_DATE) AS SHOUYILV FROM RCONFIGDATA WHERE column2 = '1' GROUP BY COLUMN1 ORDER BY COLUMN1
各个函数详解
wm_concat
该方法来自wmsys下的wm_concat函数,属于Oracle内部函数,返回值类型varchar2,最大字符数4000。随着版本的变更返回值类型可能会有改动,项目中使用时候最好在新的用户下创建一个函数。
使用方法:
select deptno,wm_concat(ename) from emp group by deptno;
排序方法(未必仅此一种写法):
select *
from (select wm_concat(ename) over(partition by deptno order by empno) val,
row_number() over(partition by deptno order by empno desc) rn,
a.*
from emp a)
where rn = 1;
如果仅是简单聚合数据,可以使用该函数,
优点:效率高。
缺点:
(1)、返回最大字符数4000;
(2)、行数据默认以逗号分隔,可以修改函数更改,但是函数一旦创建不能随意自定义分隔符;
(3)、排序实现复杂且效率低;
(4)、内部聚合混乱。比如:
select wm_concat(col1) col3,wm_concat(col2) col4 from tab;
返回的col3和col4里的聚合数据未必是一一对应的。
zh_concat
该函数是在wm_concat基础上修改返回值类型得到,可以返回clob类型数据,内部实现同wm_concat。优缺点同wm_concat。
listagg
11g新增函数,返回值varchar2,同样受4000字符数限制。但是可以排序,可以指定分隔符。
使用方法:
select deptno,listagg(ename,',') within group(order by empno) from emp group by deptno
优点:
(1)、可排序
(2)、可自定义分隔符
缺点:
(1)、仅11g之后版本可用
(2)、返回最大字符数4000
xmlagg
该方法通过将数据聚合成xml结构,再转换成varchar2或者clob类型。
使用方法:
select deptno,xmlagg(xmlparse(content ename||',' wellformed) order by empno).getstringVal() from emp group by deptno;
select deptno,xmlagg(xmlparse(content ename||',' wellformed) order by empno).getclobval() from emp group by deptno;
优点:
(1)、可排序
(2)、可返回clob类型容纳大数据量数据
(3)、可自定义分隔符
(4)、10g可用
缺点:
(1)、在不排序的情况下效率比wm_concat、zh_concat差
(2)、在排序情况下效率比listagg差
(3)、最终数据在后面或者前面会多一个分隔符,需要再做处理
sys_connect_by_path
借助connect by实现数据聚合。
实现方法:
select deptno, res
from (select rn, level, deptno, sys_connect_by_path(ename, ',') res,
connect_by_isleaf il
from (select row_number() over(partition by deptno order by empno) rn,a.*
from emp a)
start with rn = 1
connect by deptno = prior deptno
and prior rn = rn - 1)
where il = 1
该方法实现复杂,效率低下,这里不再讨论。
总结
不同场景下使用不同方法(最佳选择):
|
10g |
11g以上 |
排序(varchar2) |
xmlagg |
listagg |
排序(clob) |
xmlagg |
xmlagg |
不排序(varchar2) |
wm_concat |
wm_concat |
不排序(clob) |
zh_concat |
zh_concat |
相关推荐
Oracle 聚合函数是指在 Oracle 数据库中对数据进行汇总和计算的函数。这些函数可以对数据进行统计、分析和计算,得到有用的信息。 1. COUNT(*):COUNT(*) 函数用于计算查询结果中的记录数。例如,SELECT COUNT(*) ...
在Oracle数据库中,分析函数和聚合函数是SQL查询中用于处理和汇总数据的重要工具。本文将详细介绍两者的主要功能和用法。 首先,我们关注的是排名函数。在Oracle中,有三种常用的排名函数: 1. `RANK()`: 这个函数...
最后,提供的文档和文本文件,如"oracle日期和时间处理汇总.doc"、"Oracle聚合函数RANK和dense_rank的使用.htm"等,都是极好的学习资源,可以深入研究每个函数的详细信息和示例。通过阅读和实践,你将能够充分利用...
这些函数可以大致分为以下几类:分析函数、聚合函数、转换函数、日期型函数、字符型函数、数值型函数以及其他函数。本文将详细介绍每种类型的函数,并提供具体的使用场景和示例。 #### 二、分析函数 分析函数主要...
在实际操作中,Oracle还提供了许多其他函数和特性,如聚合函数(SUM, AVG, COUNT等)、连接查询、子查询、游标、触发器等。了解并熟练掌握这些函数和操作是成为Oracle数据库管理员的基础。在编写SQL语句时,应遵循...
本资源“oracle数据仓库分析函数汇总”聚焦于Oracle数据库中的分析函数,尤其是与`OVER()`子句相关的应用,这是一系列功能强大的SQL工具,用于处理窗口或分组数据。 首先,`OVER()`子句允许在单个SQL查询中定义一个...
6. 聚合函数:如COUNT(计数)、SUM(求和)、AVG(平均值)、MAX/MIN(最大值/最小值)等,用于汇总数据。 7. 位操作函数:如BITAND(按位与)、BITOR(按位或)、BITNOT(按位非)等,处理二进制数据。 8. 非...
3. "oracle函数介绍(3) 著名函数之聚合函数.doc":聚合函数用于对一组值进行操作并返回一个单一的汇总值。SUM()、AVG()、MAX()和MIN()是最常见的例子,它们分别用于求和、计算平均值、找出最大值和最小值。 4. ...
7. 分组和聚合函数: - `GROUP BY`:对查询结果进行分组。 - `ROLLUP` 和 `CUBE`:生成多级汇总数据。 - `HAVING`:在分组后过滤数据。 8. 连接函数: - `JOIN`:将多个表的数据结合在一起。 - `LEFT JOIN`, `...
报表函数主要涉及对数据的汇总和聚合,如`COUNT()`, `SUM()`, `AVG()`, `MAX()`, `MIN()`等。这些函数通常用于生成报表,但也可以结合分析函数在特定窗口内进行更复杂的计算。 ### 结论 Oracle的分析函数、窗口...
Oracle数据库中的聚合函数是SQL查询中的重要组成部分,用于对数据进行汇总统计。当我们需要更复杂的分组和汇总信息时,可以使用扩展的聚合功能,如ROLLUP、CUBE以及GROUPING()和GROUPING_ID()函数。这些功能允许我们...
5. **聚集函数**:在数据聚合时,聚集函数非常有用。如`COUNT`统计行数,`SUM`求和,`AVG`计算平均值,`MAX`和`MIN`分别找出最大和最小值。这些函数常在SQL查询的GROUP BY语句中使用,进行数据汇总。 6. **分析函数...
**累积聚合函数** - **SUM**: 计算指定表达式的总和。 - **MIN** 和 **MAX**: 查找表达式的最小值和最大值。 - **AVG**: 计算表达式的平均值。 - **COUNT**: 对符合条件的行进行计数。 ##### 2. **排名函数** ...
5. **聚合函数** - `COUNT()`:计算行数。 - `SUM()`:求和。 - `AVG()`:计算平均值。 - `MAX()` 和 `MIN()`:找出最大值和最小值。 6. **窗口函数** - `ROW_NUMBER()`:为每一行分配一个唯一的行号。 - `...
通过以上实例可以看出,DECODE函数在Oracle数据库中是一个非常灵活且强大的工具,能够帮助我们在查询中实现复杂的条件判断和数据处理,特别是在需要进行行列互换、数据聚合等场景下,DECODE函数的应用显得尤为关键。
其中,分组函数是Oracle SQL查询中的重要组成部分,用于处理大量数据并进行聚合操作。本篇文章将详细阐述Oracle分组函数的概念、功能以及常用分组函数的使用方法。 一、分组函数概述 分组函数主要作用于一组数据上...
分析函数的主要作用是进行聚合操作,但与传统的聚合函数(如SUM, COUNT, AVG等)不同,它们不仅能够对整个数据集进行汇总,还能在每个分组内产生多行结果,从而提供了更为灵活的数据分析选项。 1. 分析函数的基本...
4. **聚合函数**: - `COUNT()`: 计算一组值的数量。 - `SUM()`: 计算一组值的总和。 - `AVG()`: 计算一组值的平均值。 - `MAX()`: 找出一组值的最大值。 - `MIN()`: 找出一组值的最小值。 5. **转换函数**: ...