[SQL]把多行数据拼接成一行,用分隔符(如逗号)隔开

2021-02-28 72点热度 0人点赞 0条评论

前言

在写SQL语句的时候,有时候需要将多行的数据合并到一行上,比如在联合其他一对多的表的时候,或者在做group分组的时候。

举个例子,有一个部门表t_department(id, name),一个员工表t_staff(id, name, sex, department_id), 两者是一对多的关系,

  • 需求1 select 部门表,以及部门里的员工的姓名,都逗号隔开:1, '财务部','张三,李四,王五'
  • 需求2 select 员工表,按男女分组,列出人名:'男','张三,李四' '女','王五'

MySQL的实现,利用GROUP_CONCAT

-- 联合其他表的情况(需求1)
select id, 
(select group_concat(name) from t_staff t2 where t2.department_id=t1.id ) as names
from t_department t1

-- 分组的情况(需求2)
select sex, group_contact(name separator ',') from t_staff group by sex 

-- GROUP_CONCAT还可以排序,见下面的例子
SELECT GROUP_CONCAT(COLUMN_X SEPARATOR order by COLUMN_X asc ',') FROM <<table>> GROUP BY NULL

Oracle的实现,利用wm_concat、LISTAGG

见下面的例子

select grp, wmsys.wm_concat(str)
  from (select 1 grp, 'a1' str
          from dual
        union
        select 1 grp, 'a2' str
          from dual
        union
        select 2 grp, 'b1' str
          from dual
        union
        select 2 grp, 'b2' str
          from dual
        union
        select 2 grp, 'b3' str from dual) t
 group by grp
 
 select wm_concat(table_name) 
  from user_tables;
  
-- or 11.2g:
-- 利用LISTAGG
  LISTAGG
  

 

admin

这个人很懒,什么都没留下

文章评论

*

code