
本文详解如何修正 sql 查询逻辑,正确按月份和木材类型(如 a-001、a-003)汇总 `cubic` 体积数据,并在 html 表格中动态渲染结果。核心在于区分字段用途:用 `wood` 字段匹配类型,对 `cubic` 字段求和,而非错误地用 `cubic` 值做条件判断。
在开发木材加工或林业管理类系统时,常需将原始生产数据(如 furesz 表)按时间维度(月)与业务维度(木材种类)进行交叉汇总。你遇到的问题本质是 SQL 条件聚合逻辑错误:原代码中 SUM(IF(cubic='A-001',1,0)) 试图用 cubic 字段(存储体积数值,如 0.25)去匹配木材编码(如 'A-001'),这必然导致所有条件为假,返回全 0.0。
✅ 正确做法是:以 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
ORDER BY month;? 说明:SUM(IF(wood='A-001', cubic, 0)) 表示——当 wood 值为 'A-001' 时,累加其对应的 cubic 数值;否则加 0。这样即可精准按木材类型分组求和。
✅ 对应的 PHP+HTML 渲染代码(含健壮性增强)
Hónap Nyár Tölgy VTölgy Cser Összesen Query failed: " . mysqli_error($conn) . " "; } elseif (mysqli_num_rows($result_list) === 0) { echo ""; } else { while ($row = mysqli_fetch_assoc($result_list)) { // 使用 number_format() 确保小数位统一(注意:MySQL 中 numeric 值可能含逗号,PHP 需确保 locale 或使用 str_replace 处理) $format = function($val) { return number_format((float)$val, 2, '.', ''); }; ?> Nincs adat a kiválasztott gépre ('mebor2'). = $row['month'] ?> = $format($row['sum_nyar']) ?> m³ = $format($row['sum_tölgy']) ?> m³ = $format($row['sum_vtölgy']) ?> m³ = $format($row['sum_cser']) ?> m³ = $format($row['sum_full']) ?> m³
⚠️ 注意事项与最佳实践
- 字段类型校验:确保 cubic 在 MySQL 中为 DECIMAL 或 FLOAT 类型(非 VARCHAR),否则 SUM() 可能隐式转换失败。
- 区域设置兼容性:若数据库中 cubic 存储为 0,25(逗号小数点),需先用 REPLACE(cubic, ',', '.') 转换,或在应用层预处理。
- 扩展性建议:硬编码木材类型(A-001, A-003)不利于维护。进阶方案可建立 wood_types 字表,通过 LEFT JOIN + 动态列生成(配合 GROUP_CONCAT 或应用层 pivot)。
- 安全性提醒:当前示例未做参数化,若 machine 值来自用户输入,请务必改用 mysqli_prepare() 防止 SQL 注入。
通过本次修正,你将获得真正符合业务需求的动态汇总表——既体现每月各木材类型的精确产出,又保持总和一致性,为生产分析与决策提供可靠数据支撑。











