2025 年 1-8 月与 2026 年 1-8 月报送的企业数量不同(664 家 vs 636 家),
直接相减的差额里混着「企业名单变了」的影响。本功能按**同名企业口径**
(两年 1-8 月都报送过的企业名称交集,共 545 家)分别汇总两年 1-8 月累计的
货运量与**货物周转量**,保证两年企业范围完全一致,可直接用于同比。
docs/生成汇总大表/同名企业_1-8月累计对比_2026-09-19.sql(含 6 条查询)traffic_audit.h2032_enterprise_monthly(交企统H203-2表,企业级月报)freight_total 货运量(吨)、turnover_total 货物周转量(吨公里)、report_period 报表期('YYYY-MM')、enterprise_name 企业名称report_period BETWEEN 'YYYY-01' AND 'YYYY-08'127.0.0.1:3308,库 traffic_audit--default-character-set=utf8mb4mysql ... < 同名企业_1-8月累计对比_2026-09-19.sqlreport_period 共 20 个报表期(2025-01 ~ 2026-08),合计 13056 行;| 编号 | 类型 | 用例 | 输入 | 预期 | 实际 | 结论 |
|---|---|---|---|---|---|---|
| T1 | 正向 | 同名企业口径汇总(查询 1) | 两年 1-8 月都报送过的企业 | 一行内出两年累计数 | 545 家;货运量 30153.14 / 27752.68 万吨,周转量 4635340.46 / 4389882.05 万吨公里 | 通过 |
| T2 | 正向 | 逐企业对照明细(查询 2) | 同上 | 每家一行、两年并排 | 545 行,含两年值、增减额、同比 | 通过 |
| T3 | 正向 | 明细求和 = 汇总行 | 查询 2 的 545 行按列求和 | 与查询 1 完全一致 | 30153.14 / 4635340.46 / 27752.68 / 4389882.05,差异 0 | 通过 |
| T4 | 正向 | 口径对照(查询 3) | 全量 vs 同名 | 4 行口径可解释差额 | 全量 2025:664 家 33994.45 万吨 / 5102518.95 万吨公里;全量 2026:636 家 31399.82 万吨 / 4927161.77 万吨公里 | 通过 |
| T5 | 正向 | 差异企业名单(查询 4) | 只在一年报送的企业 | 家数与差额相符 | 2025 独有 119 家、2026 独有 91 家;家数校验 664−545=119、636−545=91 | 通过 |
| T6 | 正向 | 差异金额闭合 | 同名 + 独有 = 全量 | 金额闭合 | 货运量 30153.14+3841.31=33994.45(=全量 2025);周转量 4635340.46+467178.48=5102518.94(全量 5102518.95,差 0.01 为四舍五入) | 通过 |
| T7 | 正向 | 分市州汇总(查询 5) | 同名企业按 region_code 归市州 | 市州合计 = 全省 | 16 个市州(仙桃 0 家同名企业),企业数合计 545,各列合计 = 查询 1 | 通过 |
| T8 | 正向 | 入库抽查:逐月相加对齐 | 武汉钢铁集团物流有限公司 2025-01~08 共 8 条原始记录 | 逐月相加 = 明细行 | 货运量 7381512 吨 → 738.15 万吨;周转量 231191873 吨公里 → 23119.19 万吨公里,与查询 2 输出一致 | 通过 |
| T9 | 负向 | 企业名不存在 | enterprise_name='不存在的企业XYZ' |
0 行、不报错 | 0 行 | 通过 |
| T10 | 负向 | 年份写错 | 期间 '2024-01' ~ '2024-08' |
0 行 | 0 行 | 通过 |
| T11 | 边界 | 同一企业同月重复记录 | GROUP BY enterprise_name, report_period HAVING COUNT(*)>1 |
无重复(否则累计会被放大) | 0 条 | 通过 |
| T12 | 边界 | 同名企业月份不全(查询 6) | 记录数 <> 8 的同名企业 | 无异常 | 空结果集,545 家两年各 8 个月齐全 | 通过 |
enterprise_name 字符串相等匹配,若企业改名、或不同地市出现完全同名的企业,unified_credit_code(统一社会信用代码)匹配。ROUND(...,2) 输出 −5.30(显示为 −5.3),region_code 取 2026 年记录MAX(CASE WHEN report_period >= '2026-01' ...) 取 2026 年的地区代码,用户要求把企业明细也导出来,脚本追加两条查询:
unified_credit_code(统一社会信用代码),共 546 家,91420112558443820B:2025-01~2025-09 叫--batch --raw 导 tsv、Navicat/Workbench 导 xlsx、SELECT ... INTO OUTFILE。补充测试:
| 编号 | 类型 | 用例 | 预期 | 实际 | 结论 |
|---|---|---|---|---|---|
| T13 | 正向 | 查询 7 明细行数 | 546 行 | 546 行,其中 1 行 是否改名='是' |
通过 |
| T14 | 正向 | 查询 7 明细求和 = 查询 8 合计 | 一致(允许四舍五入尾差) | 明细逐行四舍五入后求和 30163.10 / 27764.86 / 4637038.56 / 4392984.78,与合计差 0.01~0.02,属正常尾差 | 通过 |
| T15 | 正向 | 命令行导出(方式一) | 生成 UTF-8 的 tsv,含 546 行数据 | 89046 字节、546 行数据、中文列名与企业名正常 | 通过 |
| T16 | 边界 | Excel 直接双击 tsv | 存在中文乱码风险 | 文件为 UTF-8 无 BOM,已在脚本内注明改用「数据 → 从文本/CSV」导入或直接导 xlsx | 通过 |
| T17 | 边界 | 明细中同比除零 | 基期为 0 时不报错 | NULLIF(...,0) 保护,返回空值 |
通过 |
问题:脚本原先在明细类查询(查询 2、查询 7)里把「万吨 / 万吨公里」列写成 ROUND(..., 2)。
保留 2 位小数 = 精度只到 100 吨。用户按这两列在 Excel 里算「平均运距 = 周转量 ÷ 货运量」时,
货运量小的企业分母被砍小,运距被明显放大。
实例(2026 年 1-8 月,湖北弘雷物流有限公司,源数据 4631 吨 / 5867730 吨公里):
| 货运量(万吨) | 算得的平均运距 | 结论 |
|---|---|---|
| 0.4631(不取整) | 1267.05 公里 | 正确(与数据库全精度一致) |
| 0.46(取 2 位) | 1275.59 公里 | 虚高 8.53 公里 |
处置:
ROUND(..., 4);回归验证:
| 编号 | 用例 | 预期 | 实际 | 结论 |
|---|---|---|---|---|
| T18 | 整脚本重跑 | 无报错、行数不变 | 1352 行输出、无 ERROR | 通过 |
| T19 | 查询 7 明细列精度 | 货运量/周转量 4 位小数 | 湖北弘雷 2026 年货运量 0.4631(原 0.46)、周转量 586.773 | 通过 |
| T20 | 用明细列复算运距 | 与数据库全精度一致 | 586.773 ÷ 0.4631 = 1267.05 公里,与库内 1267.0546 一致 | 通过 |
| T21 | 汇总列未被改动 | 查询 1/3/5/8 仍为 2 位 | 查询 8 仍输出 546 / 30162.99 / 27764.88 / 4637038.58 / 4392984.81 | 通过 |
用户确认按「全精度」导出,明细类查询(查询 2、查询 7)的 ROUND 全部去掉,导出即原始值。
改动:
ROUND;精度说明(实测):货运量、周转量的原始值是整吨 ÷ 10000,小数位**最多 4 位**,
取 4 位即等于全精度;实测 2026 年 1-8 月的 636 家企业中,"4 位小数以外还有尾数"的为 0 家。
同比百分比是除出来的,小数位会较长(如 −2.5389920113927933),介意可在外面再套 ROUND(...,2)。
回归验证:
| 编号 | 用例 | 预期 | 实际 | 结论 |
|---|---|---|---|---|
| T22 | 整脚本重跑 | 无报错、行数不变 | 1352 行输出、无 ERROR | 通过 |
| T23 | 查询 7 导出不含 ROUND | 输出原始值 | 武钢物流 738.1512 / 719.4096;湖北弘雷 0.6863 / 0.4631;周转量 889.1465 / 586.773 | 通过 |
| T24 | 导出结果仍为 546 行 | 546 行 | 546 行数据(tsv 546 行 + 表头) | 通过 |
| T25 | 用导出值复算运距 | 与库一致 | 586.773 ÷ 0.4631 = 1267.05 公里,与库内 1267.0546 一致 | 通过 |
用户提问:"如果没有改名那家,查询 2 和查询 7 能完全对上吗?"——实测答案:**逐比特完全相等**。
验证方法:把改名企业 91420112558443820B 从查询 7 的结果中剔除,与查询 2 的结果逐行逐列比对。
| 比对项 | 结果 |
|---|---|
| 数据行数 | 查询 2 = 545 行;查询 7 剔除那家 = 545 行 |
| 企业名单 | 完全一致(双向差集均为空) |
| 货运量 2025 / 2026 / 增减 / 同比 | 不一致 0 家,最大差 0 |
| 周转量 2025 / 2026 / 增减 / 同比 | 不一致 0 家,最大差 0 |
| 地区代码 | 不一致 0 家 |
原因(两条):
补充用例:
| 编号 | 类型 | 用例 | 预期 | 实际 | 结论 |
|---|---|---|---|---|---|
| T26 | 正向 | 查询 2 与查询 7 等价性 | 剔除改名企业后两者完全一致 | 545 行企业名单一致;8 个数值列 + 地区代码全部 0 家不一致、最大差 0 | 通过 |
实践含义:查询 7 = 查询 2 + 改名企业(信用代码口径是名称口径的超集),两者共同部分数值完全相同。
要跟 545 家交付件对账用查询 2;要防将来再出现改名企业,用查询 7 更稳。
背景:确认「4 位小数」对哪些列等于全精度后,决定把汇总类查询也统一为 4 位。
先厘清"4 位 = 全精度"的适用范围(实测 754 个企业/信用代码):
| 列 | ROUND(v,4) <> v 的家数 |
结论 |
|---|---|---|
| 货运量 2025 / 2026 | 0 家 | 4 位即全精度(整吨 ÷ 10000,最多 4 位小数) |
| 周转量 2025 / 2026 | 0 家 | 同上 |
| 平均运距 | 628 / 631 家 | 不等于全精度,是除出来的商,需单独定位数 |
| 同比百分比 | 541 / 754 家 | 不等于全精度,同上 |
处置:
/ 10000, 2) 全部改为 4 位;回归验证:
| 编号 | 类型 | 用例 | 预期 | 实际 | 结论 |
|---|---|---|---|---|---|
| T27 | 正向 | 整脚本重跑 | 无报错、行数不变 | 1352 行输出,无 ERROR | 通过 |
| T28 | 正向 | 查询 1 汇总(545 家) | 4 位小数 | 30153.1392 / 27752.6820 / 4635340.4627 / 4389882.0468 | 通过 |
| T29 | 正向 | 查询 8 合计(546 家) | 4 位小数 | 30162.9872 / 27764.8812 / 4637038.5803 / 4392984.8116 | 通过 |
| T30 | 正向 | 查询 5 分市州与交付件对齐 | 与交付件市州汇总一致 | 武汉 9405.2643 / 1501661.4035、宜昌 5247.5232 / 449997.1831,与交付件完全一致 | 通过 |
副作用为零:对货运量/周转量而言 4 位就是全精度,因此这次改动没有丢失任何数据;
但脚本输出现在与 545 家交付件的市州汇总**逐列对齐**,两个口径之间可以互相验证。
8 条查询整脚本执行通过,30 条用例(21 正向 / 2 负向 / 7 边界)全部通过。
同名企业口径(545 家)1-8 月累计结果:
| 指标 | 2025 年 1-8 月 | 2026 年 1-8 月 | 同比 |
|---|---|---|---|
| 货运量(万吨) | 30153.14 | 27752.68 | −7.96% |
| 货物周转量(万吨公里) | 4635340.46 | 4389882.05 | −5.30% |
其中 2026 年累计数与 2026-09-19《持续在规企业 545 家累计运距》交付件的全省行
(27752.6820 万吨 / 4389882.0468 万吨公里)完全一致,两条链路口径互证通过。