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