
本文详解如何在 php 中结合 mysql 查询,按月份分组并动态统计不同木材类型的立方数总和,解决因字段误用(将 `cubic` 值与 `wood` 类型混淆)导致的聚合结果为 0 的常见问题。
在实际木材加工或仓储管理系统中,常需按月统计各类木材(如“Nyár”、“Tölgy”)的出库/加工体积(单位:m³)。你提供的代码逻辑清晰,但关键错误在于 SQL 中 SUM(IF(...)) 的条件判断对象错误:原语句使用 cubic='A-001',而 cubic 是浮点数值字段(如 0.25),wood 才是标识木材类型的字符串字段(如 'A-001')。这导致所有 IF 条件恒为假,返回 0,仅 SUM(cubic) 正确累加了总量。
✅ 正确做法是:以 wood 字段匹配类型,对对应行的 cubic 值求和。修正后的 SQL 如下:
SELECT
MONTH(date) AS month,
COUNT(DISTINCT DATE(date)) AS work_days,
SUM(IF(wood = 'A-001', cubic, 0)) AS sum_nyar,
SUM(IF(wood = 'A-003', cubic, 0)) AS sum_tölgy,
SUM(IF(wood = 'A-004', cubic, 0)) AS sum_vtölgy,
SUM(IF(wood = 'A-018', cubic, 0)) AS sum_cser,
SUM(cubic) AS sum_full
FROM furesz
WHERE machine = 'mebor2'
GROUP BY month;? 关键修正说明:
- SUM(IF(wood='A-001', cubic, 0)):当 wood 值为 'A-001' 时,累加该行的 cubic(如 0.25),否则加 0;
- MONTH(date) 提取月份(返回 1–12 数字),适用于简单按月汇总;若需支持跨年(如区分 2022-02 与 2023-02),建议改用 DATE_FORMAT(date, '%Y-%m');
- COUNT(DISTINCT DATE(date)) 统计当月有效工作天数(去重日期),可选保留。
? PHP 输出部分优化建议(增强健壮性):
- 添加数据库查询错误检查,避免静默失败:
$result_list = mysqli_query($conn, $sql_list); if (!$result_list) { die("Query failed: " . mysqli_error($conn)); } - 使用 number_format($val, 2, '.', '') 统一小数位(示例中原始数据含逗号小数点,需确保 MySQL 返回标准浮点格式;若数据存为字符串且用逗号分隔,应在入库前清洗或使用 REPLACE(cubic, ',', '.') 转换);
- 表头“Hónap”(匈牙利语“月份”)与数据一致性无影响,但建议在生产环境统一语言或添加注释。
✅ 最终效果:对于示例数据(2月两条记录:A-001→0.25, A-003→0.35),输出将准确显示:
| Month | Nyár | Tölgy | VTölgy | Cser | SUM |
|-------|------|--------|---------|------|-----|
| 2 | 0.25 m³ | 0.35 m³ | 0.00 m³ | 0.00 m³ | 0.60 m³ |
总结:动态分类汇总的核心在于 条件聚合字段(wood)与被聚合值(cubic)的严格分离。务必确认业务字段语义——类型标识用字符串字段(wood),度量值用数值字段(cubic),避免因字段错配导致全表 SUM 为零的“幽灵问题”。










