listagg小记录

    listagg的作用是将分组范围内的所有行特定列的记录加以合并成行。函数签名中的measure_expr为分组中每个列的表达式,而delimiter为合并分割符。如果delimiter不设置的话,就表示无分割符。

    中间within group后面的order_by_clause表示的是进行合并中要遵守的排序顺序。而后面的over子句表明listagg是具有分析函数analyze funcation特性的。具体采用listagg有三个场景。


1、对于无分组  


SQL> select * from emp where deptno=30; 

EMPNO ENAME     JOB        MGR HIREDATE         SAL     COMM DEPTNO

----- ---------- --------- ----- ----------- --------- --------- ------

 7499 ALLEN     SALESMAN  7698 1981-2-20    1600.00   300.00    30

 7521 WARD      SALESMAN  7698 1981-2-22    1250.00   500.00    30

 7654 MARTIN    SALESMAN  7698 1981-9-28    1250.00  1400.00    30

 7698 BLAKE     MANAGER   7839 1981-5-1     2850.00              30

 7844 TURNER    SALESMAN  7698 1981-9-8     1500.00     0.00    30

 7900 JAMES     CLERK     7698 1981-12-3     950.00              30 

6 rows selected

 

--按照empno进行排序

SQL> select listagg(ename,' , ') within group (order byempno) from emp where deptno=30; 

LISTAGG(ENAME,',')WITHINGROUP(

------------------------------------------------------------

ALLEN , WARD , MARTIN , BLAKE , TURNER , JAMES

 

 

2、    在有分组条件下的listagg使用


SQL> select deptno, listagg(ename,' ,') within group (order by empno) from emp group by deptno; 

DEPTNO LISTAGG(ENAME,',')WITHINGROUP(

------ -------------------------------------

   10 CLARK ,KING ,MILLER

   20 SMITH ,JONES ,SCOTT ,ADAMS ,FORD

   30 ALLEN ,WARD ,MARTIN ,BLAKE ,TURNER ,JAMES 


 

 3、 使用over分组情况 

 

SQL> select deptno, ename, listagg(ename, ' , ') within group (order by empno) over (partition by deptno) as emp_list  from emp

 2 where hiredate<=add_months(sysdate,-10*12);

DEPTNO ENAME     EMP_LIST

------ ------

   10 CLARK     CLARK , KING , MILLER

   10 KING      CLARK , KING , MILLER

   10 MILLER    CLARK , KING , MILLER

   20 SMITH     SMITH , JONES , SCOTT , ADAMS , FORD

   20 JONES     SMITH , JONES , SCOTT , ADAMS , FORD

   20 SCOTT     SMITH , JONES , SCOTT , ADAMS , FORD

   20 ADAMS     SMITH , JONES , SCOTT , ADAMS , FORD

   20 FORD      SMITH , JONES , SCOTT , ADAMS , FORD

   30 ALLEN     ALLEN , WARD , MARTIN , BLAKE , TURNER , JAMES

   30 WARD      ALLEN , WARD , MARTIN , BLAKE , TURNER , JAMES

   30 MARTIN    ALLEN , WARD , MARTIN , BLAKE , TURNER , JAMES

   30 BLAKE     ALLEN , WARD , MARTIN , BLAKE , TURNER , JAMES

   30 TURNER    ALLEN , WARD , MARTIN , BLAKE , TURNER , JAMES

   30 JAMES     ALLEN , WARD , MARTIN , BLAKE , TURNER , JAMES 

14 rows selected

 




SQL中的listagg函数用于将一列的值连接成一个字符串,并可以指定连接符。通过使用listagg函数,我们可以实现类似于Oracle中的wm_concat函数的效果。引用中提到了MySQL中的对应函数group_concat()也可以实现类似的功能。 在Oracle数据库中,listagg函数在12C版本之后开始被引入,用于将一列的值连接成一个字符串。可以使用within group子句指定连接符,并使用order by子句对结果进行排序。例如,使用listagg函数查询每个部门的员工编号集合可以按照以下方式进行: ```sql select dept, listagg(id,',') within group(order by age) ids from users group by dept; ``` 这条SQL语句将会返回每个部门的员工编号集合,其中每个部门作为一条记录,员工编号之间使用逗号进行连接。 需要注意的是,如果你使用的是Oracle 11g及以下版本,则无法直接使用listagg函数。在这种情况下,你可以手动创建一个wm_concat函数来实现类似的功能,或者升级到Oracle 12C及以上版本使用listagg函数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [2020-11-02 oracle sql listagg函数使用](https://blog.csdn.net/qq_40600414/article/details/109638421)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [12C开始_wm_concat函数.sql](https://download.csdn.net/download/changxiaowei1990/12222754)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值