本文详解如何通过修正 sql 条件逻辑,正确按月份和木材型号(如 a-001、a-003)分别汇总立方米(cubic)数据,并在 html 表格中动态渲染结果。
在实际木材加工或仓储管理系统中,常需按月统计不同木材类型的出库/加工量(单位:m³)。你当前遇到的核心问题是:SQL 中误将 cubic 字段用于 IF() 的判断条件,而实际应根据 wood 字段匹配型号,再对 cubic 值求和。原始查询中 SUM(IF(cubic='A-001',1,0)) 本质是在计数(且逻辑错误),而非累加体积值——这导致所有分类列显示为 0.0 m³,仅 SUM(cubic) 正确。
✅ 正确做法是:使用 SUM(IF(wood = 'A-001', cubic, 0)) —— 即当 wood 字段匹配特定型号时,取其对应的 cubic 数值参与求和;否则计入 0。同时注意:
以下是修正后的完整 PHP + MySQL 实现代码(含健壮性增强):
| 月份 | Nyár | Tölgy | VTölgy | Cser | 合计 |
|---|---|---|---|---|---|
| 查询失败:" . mysqli_error($conn) . " | |||||
| 暂无数据 | |||||
| = htmlspecialchars($monthName) ?> | = number_format($row['sum_nyar'], 2, '.', '') ?> m³ | = number_format($row['sum_tolgy'], 2, '.', '') ?> m³ | = number_format($row['sum_vtolgy'], 2, '.', '') ?> m³ | = number_format($row['sum_cser'], 2, '.', '') ?> m³ | = number_format($row['sum_full'], 2, '.', '') ?> m³ |
? 关键改进说明:
? 进阶建议:
若木材类型较多或动态变化,可考虑用 CASE WHEN 或预聚合视图替代硬编码 IF;更灵活的方案是先查出所有唯一 wood 值,再动态构建列名与 SQL,结合 PDO 的预处理语句实现完全动态报表。