按分组把字段拼接的方法

        之前,为了把某一字段的值按某种分组在SQL语句里拼接成一个字符串,一般要先写一个函数,然后在SQL语句里调用该函数才能达到这个目的。

后来了解了oracle提供的sys_connect_by_path,觉得可以利用该功能实现,下面是实现的示例代码:

select  deptno, sys_connect_by_path(ename,  ' + ' ) ename_str
  
from ( select  deptno, ename, 
              
count (empno)  over (partition  by  deptno) c, 
              row_number() 
over (partition  by  deptno  order   by  deptno) r 
         
from  scott.emp)
    
where  c  =  r
      start 
with  r  =   1  
        connect 
by  (prior r  =  r  -   1   and  prior deptno  =  deptno)

FROM里面的语句执行结果:

SQL >   select  deptno, ename,
  
2                  count (empno)  over (partition  by  deptno) c,
  
3                 row_number()  over (partition  by  deptno  order   by  ename) r
  
4             from  scott.emp
  
5    /

DEPTNO ENAME               C          R
-- ---- ---------- ---------- ----------
     10  CLARK                3            1
    
10  KING                 3            2
    
10  MILLER               3            3
    
20  ADAMS                5            1
    
20  FORD                 5            2
    
20  JONES                5            3
    
20  SCOTT                5            4
    
20  SMITH                5            5
    
30  ALLEN                6            1
    
30  BLAKE                6            2
    
30  JAMES                6            3
    
30  MARTIN               6            4
    
30  TURNER               6            5
    
30  WARD                 6            6

14  rows selected

 

最后执行结果:

SQL >   select  deptno, sys_connect_by_path(ename,  ' + ' ) ename_str
  
2      from ( select  deptno, ename,
  
3                  count (empno)  over (partition  by  deptno) c,
  
4                 row_number()  over (partition  by  deptno  order   by  ename) r
  
5             from  scott.emp)
  
6        where  c  =  r
  
7         start  with  r  =   1
  
8           connect  by  (prior r  =  r  -   1   and  prior deptno  =  deptno)
  
9    /

DEPTNO ENAME_STR
-- ---- --------------------------------------------------------------------------------
     10   + CLARK + KING + MILLER
    
20   + ADAMS + FORD + JONES + SCOTT + SMITH
    
30   + ALLEN + BLAKE + JAMES + MARTIN + TURNER + WARD

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值