You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 11:13:13