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

PHP+MySQL实现按部门分组展示员工明细及薪资小计报表

实现PHP+MySQL分组部门员工报表(含部门薪资小计)

需求

在PHP+MySQL环境中生成员工报表,要求按部门分组展示:先列出该部门所有员工的明细行,再在部门明细下方显示该部门的薪资合计。

你尝试的SQL代码

Select id, 
       Emp-name,  
       department, 
       salary, 
       sum(salary) as total sum for each dept
from Employee 
group by department

I tried the following thing
Select id, 
       Emp-name,  
       department, 
       salary, 
       (select sum(salary) from Employee) as total sum for each dept
from Employee 
group by department

问题分析

你之前的SQL存在两个核心问题:

  1. 第一种写法中,GROUP BY department后直接选择id、Emp-name这类非聚合列,不符合MySQL默认开启的ONLY_FULL_GROUP_BY规则,会直接报错;
  2. 第二种写法里的子查询(select sum(salary) from Employee)计算的是全公司总薪资,并非单个部门的小计,而且同样存在GROUP BY用法错误。

解决方案

方法一:SQL层面直接生成明细+小计

通过UNION ALL合并员工明细和部门小计数据,再通过排序字段保证小计行在对应部门的最后:

-- 获取员工明细,标记排序优先级为1(靠前)
SELECT 
    `Emp-name` AS `Employee Name`,
    department AS `Department`,
    salary AS `Salary`,
    1 AS sort_order
FROM Employee
UNION ALL
-- 获取部门薪资小计,标记排序优先级为2(靠后)
SELECT 
    'sub total' AS `Employee Name`,
    department AS `Department`,
    SUM(salary) AS `Salary`,
    2 AS sort_order
FROM Employee
GROUP BY department
-- 按部门分组,再按排序字段排序,确保明细在前、小计在后
ORDER BY `Department`, sort_order;

注意:如果你的字段名是Emp-name,必须用反引号``包裹,否则MySQL会把减号识别成运算符导致错误。

方法二:PHP端处理数据后输出

先查询所有员工数据,在PHP代码中按部门分组累加薪资,循环输出明细后再输出对应部门的小计:

<?php
// 假设已完成MySQL连接,$conn为连接实例
$sql = "SELECT `Emp-name` AS employee_name, department, salary FROM Employee ORDER BY department";
$result = $conn->query($sql);

$current_dept = '';
$dept_total = 0;

// 输出表格结构
echo '<table class="s-table">';
echo '<thead><tr><th>Employee Name</th><th>Department</th><th>Salary</th></tr></thead>';
echo '<tbody>';

while ($row = $result->fetch_assoc()) {
    $emp_name = $row['employee_name'];
    $dept = $row['department'];
    $salary = $row['salary'];

    // 切换部门时,输出上一个部门的小计
    if ($current_dept !== '' && $current_dept !== $dept) {
        echo "<tr><td>sub total</td><td>{$current_dept}</td><td>{$dept_total}</td></tr>";
        $dept_total = 0;
    }

    // 输出员工明细行
    echo "<tr><td>{$emp_name}</td><td>{$dept}</td><td>{$salary}</td></tr>";
    
    // 累加部门薪资
    $dept_total += $salary;
    $current_dept = $dept;
}

// 输出最后一个部门的小计
if ($current_dept !== '') {
    echo "<tr><td>sub total</td><td>{$current_dept}</td><td>{$dept_total}</td></tr>";
}

echo '</tbody></table>';

// 关闭数据库连接
$conn->close();
?>

最终效果(对应你期望的输出)

Employee NameDepartmentSalary
UmarIT50000
aliIT40000
sub totalIT90000
waseemHR25000
waqarHR15000
sub totalHR40000

内容的提问来源于stack exchange,提问作者Mian Omer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:52:19