CREATE TABLE EMP
(EMPNO integer NOT NULL,
ENAME VARCHAR(10),
JOB VARCHAR(9),
MGR integer,
HIREDATE DATE,
SAL integer,
COMM integer,
DEPTNO integer);
INSERT INTO EMP values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, NULL, 20);
INSERT INTO EMP values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-2-20', 1600, 300, 30);
INSERT INTO EMP VALUES (7521, 'WARD', 'SALESMAN', 7698, '1981-2-22', 1250, 500, 30);
INSERT INTO EMP VALUES (7566, 'JONES', 'MANAGER', 7839, '1981-4-2', 2975, NULL, 20);
INSERT INTO EMP VALUES (7654, 'MARTIN', 'SALESMAN', 7698, '1981-9-28', 1250, 1400, 30);
INSERT INTO EMP VALUES (7698, 'BLAKE', 'MANAGER', 7839, '1981-5-1', 2850, NULL, 30);
INSERT INTO EMP VALUES (7782, 'CLARK', 'MANAGER', 7839, '1981-6-9', 2450, NULL, 10);
INSERT INTO EMP VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1982-12-9', 3000, NULL, 20);
INSERT INTO EMP VALUES (7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000, NULL, 10);
INSERT INTO EMP VALUES (7844, 'TURNER', 'SALESMAN', 7698, '1981-9-8', 1500, 0, 30);
INSERT INTO EMP VALUES (7876, 'ADAMS', 'CLERK', 7788, '1983-1-12', 1100, NULL, 20);
INSERT INTO EMP VALUES (7900, 'JAMES', 'CLERK', 7698, '1981-12-3', 950, NULL, 30);
INSERT INTO EMP VALUES (7902, 'FORD', 'ANALYST', 7566, '1981-12-3', 3000, NULL, 20);
INSERT INTO EMP VALUES (7934, 'MILLER', 'CLERK', 7782, '1982-1-23', 1300, NULL, 10);
/* mysql */
select deptno,
group_concat(ename order by empno separator ',') as emps
from emp
group by deptno
/* oracle 11g*/
select deptno,
listagg(ename, ',') within group (order by empno) as emps
from emp
group by deptno
/* oracle */
select deptno, ltrim(sys_connect_by_path(ename, ','),',') emps from (
select deptno, ename,
row_number() over (partition by deptno order by empno) rn,
count(*) over (partition by deptno) cnt
from emp)
where level = cnt
start with rn = 1
connect by prior deptno = deptno and prior rn = rn -1
--sql server
with x (deptno, empno, list, cnt, leng) as (
select deptno, empno, convert(varchar(100), ename) list, count(*) over (partition by deptno) as cnt, 1 as leng
from emp
union all
select e.deptno, e.empno, convert(varchar(100), x.list + ',' + e.ename),x.cnt,x.leng + 1
from emp e, x
where e.deptno = x.deptno
and e.empno > x.empno
)
select deptno, list
from x
where leng = cnt
order by deptno
--sql server 2019
select deptno, STRING_AGG(ename, ',') within group (order by ename) as list
from emp
group by deptno
select deptno, STRING_AGG(ename, ',') within group (order by ename) as list
into emp2
from emp
group by deptno
--拆分
select deptno, value
from emp2
cross apply string_split(list, ',')
2020 WangYu.Art All Rights Reserved