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存在两个核心问题:
- 第一种写法中,
GROUP BY department后直接选择id、Emp-name这类非聚合列,不符合MySQL默认开启的ONLY_FULL_GROUP_BY规则,会直接报错; - 第二种写法里的子查询
(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 Name | Department | Salary |
|---|---|---|
| Umar | IT | 50000 |
| ali | IT | 40000 |
| sub total | IT | 90000 |
| waseem | HR | 25000 |
| waqar | HR | 15000 |
| sub total | HR | 40000 |
内容的提问来源于stack exchange,提问作者Mian Omer
相关产品推荐
相关产品推荐

