Oracle行专列函数Listagg()

本文介绍 Oracle 数据库中的 LISTAGG 函数,通过示例展示了如何将多个行的数据汇总为一个字符串,包括基本用法及 OVER 子句的高级应用。
Oracle行专列函数Listagg()
 
这是一个Oracle的行转列函数:LISTAGG()
 www.2cto.com  
先看示例代码:
Sql代码  
with temp as(  
  select 'China' nation ,'Guangzhou' city from dual union all  
  select 'China' nation ,'Shanghai' city from dual union all  
  select 'China' nation ,'Beijing' city from dual union all  
  select 'USA' nation ,'New York' city from dual union all  
  select 'USA' nation ,'Bostom' city from dual union all  
  select 'Japan' nation ,'Tokyo' city from dual   
)  
select nation,listagg(city,',') within GROUP (order by city)  
from temp  
group by nation  
 这是最基础的用法:
LISTAGG(XXX,XXX) WITHIN GROUP( ORDER BY XXX)
 
用法就像聚合函数一样,通过Group by语句,把每个Group的一个字段,拼接起来。
非常方便。
 
同样是聚合函数,还有一个高级用法:
就是over(partition by XXX)
也就是说,在你不实用Group by语句时候,也可以使用LISTAGG函数:
  www.2cto.com  
Sql代码  
with temp as(  
  select 500 population, 'China' nation ,'Guangzhou' city from dual union all  
  select 1500 population, 'China' nation ,'Shanghai' city from dual union all  
  select 500 population, 'China' nation ,'Beijing' city from dual union all  
  select 1000 population, 'USA' nation ,'New York' city from dual union all  
  select 500 population, 'USA' nation ,'Bostom' city from dual union all  
  select 500 population, 'Japan' nation ,'Tokyo' city from dual   
)  
select population,  
       nation,  
       city,  
       listagg(city,',') within GROUP (order by city) over (partition by nation) rank  
from temp  
 
总结:LISTAGG()把它当作SUM()函数来使用就可以了。
### Oracle LISTAGG 函数的用法及示例 Oracle 中的 `LISTAGG` 函数用于将多数据合并为单个字符串,常用于字符串聚合操作。该函数支持指定分隔符,并可对结果进排序[^1]。 #### 基本语法 ```sql LISTAGG(expression, delimiter) WITHIN GROUP (ORDER BY order_clause) ``` - `expression`:需要聚合的列或表达式。 - `delimiter`:指定用于分隔值的字符串。 - `WITHIN GROUP (ORDER BY order_clause)`:定义聚合值的排序方式。 #### 使用示例 以下示例展示如何将某列的多个值合并为逗号分隔的字符串: ```sql SELECT dept_id, LISTAGG(emp_name, ', ') WITHIN GROUP (ORDER BY emp_name) AS employees FROM employees GROUP BY dept_id; ``` 该查询将每个部门的员工姓名按字母顺序排列,并用逗号和空格连接成一个字符串[^1]。 #### 高级用法 在复杂查询中,`LISTAGG` 可与其他函数结合使用。例如,结合 `DISTINCT` 去重后再进聚合: ```sql SELECT dept_id, LISTAGG(emp_name, ', ') WITHIN GROUP (ORDER BY emp_name) AS unique_employees FROM ( SELECT DISTINCT dept_id, emp_name FROM employees ) GROUP BY dept_id; ``` 此查询确保每个员工姓名仅出现一次,再进字符串聚合[^1]。 #### 注意事项 - `LISTAGG` 的结果长度有限制(默认为 4000 字符),超出后会抛出 `ORA-01489` 错误。为避免此问题,可使用 `ON OVERFLOW TRUNCATE` 选项(适用于 Oracle 12.2 及以上版本): ```sql SELECT dept_id, LISTAGG(emp_name, ', ' ON OVERFLOW TRUNCATE) WITHIN GROUP (ORDER BY emp_name) AS employees FROM employees GROUP BY dept_id; ``` 该语句在字符串超出长度限制时自动截断并添加省略号,而不是抛出错误[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值