基于EMP表按部门统计员工数并获取对应员工姓名的SQL实现
嘿,这个需求其实挺常见的,不同的关系型数据库都有专门的字符串聚合函数,能把分组内的多行姓名合并成逗号分隔的列表,结合GROUP BY就能完美实现你要的效果。下面是主流数据库的具体解决方案:
按部门统计员工数并拼接姓名列表
MySQL/MariaDB 实现
用GROUP_CONCAT()函数直接搞定,它可以将分组内的ENAME字段拼接成指定分隔符的字符串:
SELECT DEPTNO AS DeptNo, COUNT(*) AS Count, GROUP_CONCAT(ENAME SEPARATOR ',') AS Ename FROM EMP GROUP BY DEPTNO ORDER BY DEPTNO;
小提示:如果想要姓名按字母排序,可以在函数里加排序逻辑,比如
GROUP_CONCAT(ENAME ORDER BY ENAME SEPARATOR ',')
Oracle 实现
Oracle 11g及以上版本推荐用标准的LISTAGG()函数,低版本可以用WM_CONCAT()(不过WM_CONCAT是Oracle私有函数,优先用LISTAGG更稳妥):
SELECT DEPTNO AS DeptNo, COUNT(*) AS Count, LISTAGG(ENAME, ',') WITHIN GROUP (ORDER BY ENAME) AS Ename FROM EMP GROUP BY DEPTNO ORDER BY DEPTNO;
SQL Server 实现
SQL Server 2017及以上版本支持简洁的STRING_AGG()函数,2017以下版本需要用FOR XML PATH的方式来手动拼接:
2017+ 版本
SELECT DEPTNO AS DeptNo, COUNT(*) AS Count, STRING_AGG(ENAME, ',') WITHIN GROUP (ORDER BY ENAME) AS Ename FROM EMP GROUP BY DEPTNO ORDER BY DEPTNO;
2017以下版本
SELECT DEPTNO AS DeptNo, COUNT(*) AS Count, STUFF(( SELECT ',' + ENAME FROM EMP e2 WHERE e2.DEPTNO = e1.DEPTNO ORDER BY ENAME FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS Ename FROM EMP e1 GROUP BY DEPTNO ORDER BY DEPTNO;
PostgreSQL 实现
PostgreSQL用STRING_AGG()函数就可以,用法和SQL Server类似:
SELECT DEPTNO AS DeptNo, COUNT(*) AS Count, STRING_AGG(ENAME, ',' ORDER BY ENAME) AS Ename FROM EMP GROUP BY DEPTNO ORDER BY DEPTNO;
执行对应的SQL后,就能得到你期望的输出格式:每个部门一行,包含部门编号、员工数量和逗号分隔的员工姓名列表。
内容的提问来源于stack exchange,提问作者Lokesh_K
相关产品推荐
相关产品推荐

