# 24H换单率验证SQL修复计划 **日期**:2026-05-16 **问题**:汇总统计SQL报错 - `ArrivalFormsWithDate` 表不存在 **目标**:找到正确的表名,修复SQL并重新验证 --- ## 问题诊断 ### 错误信息 ``` 1146 - Table 'lr01mainusa.ArrivalFormsWithDate' doesn't exist ``` ### 原因分析 - `ArrivalFormsWithDate` 是在原SQL中创建的CTE(公用表表达式) - 但在汇总验证SQL中,我们可能没有完整包含这个CTE的定义 - 或者表名需要使用其他的到货表 --- ## 修复方案 ### 方案1:查找正确的到货表名 需要找到以下表之一: 1. `ArrivalForms` - 原始到货表 2. `arrival_forms` - 小写版本 3. 其他相关的到货表 可以用以下查询查看可用的表: ```sql -- 查找包含"arrival"的表 SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'lr01mainusa' AND TABLE_NAME LIKE '%arrival%' ORDER BY TABLE_NAME; -- 查找包含"form"的表 SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'lr01mainusa' AND TABLE_NAME LIKE '%form%' ORDER BY TABLE_NAME; ``` ### 方案2:查看原始完整SQL中的表名 检查 `LabelReplaceRepository.cs` 中的完整SQL,看 `ArrivalFormsWithDate` 是如何定义的。 ### 方案3:修复验证SQL 一旦找到正确的表名,修复SQL的步骤: 1. **识别正确的表结构**: - 到货表的名称 - 日期字段名称(到货时间或到货日期) - 交接单号字段名称(HandoverNumber或其他) 2. **调整SQL语句**: - 用实际表名替换 `ArrivalFormsWithDate` - 调整字段名称和连接条件 3. **测试修复后的SQL**: - 先执行 `SELECT` 子句中的单个子查询进行测试 - 逐步组建完整查询 --- ## 详细的修复步骤 ### 步骤1:查找正确的表名 执行以下查询来发现数据库中存在的表: ```sql -- 步骤1a:查看所有表 SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'lr01mainusa' AND TABLE_NAME NOT LIKE 'mysql%' ORDER BY TABLE_NAME LIMIT 50; -- 步骤1b:查看label相关的表 SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'lr01mainusa' AND TABLE_NAME LIKE '%label%' ORDER BY TABLE_NAME; -- 步骤1c:检查原SQL中使用的表 -- 查看 label_replace_requests 表的结构 DESC label_replace_requests; -- 步骤1d:查看是否有到货表 SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'lr01mainusa' AND (TABLE_NAME LIKE '%arrival%' OR TABLE_NAME LIKE '%form%' OR TABLE_NAME LIKE '%handover%') ORDER BY TABLE_NAME; ``` ### 步骤2:根据找到的表名修复SQL 假设找到的表名是 `arrival_forms`(示例),修复方式如下: **修改前**: ```sql FROM ArrivalFormsWithDate a INNER JOIN label_replace_requests l ON l.BillOfLadingNumber = a.HandoverNumber OR l.MasterPackageNumber = a.HandoverNumber ``` **修改后**: ```sql FROM arrival_forms a INNER JOIN label_replace_requests l ON l.BillOfLadingNumber = a.handover_number OR l.MasterPackageNumber = a.handover_number ``` ### 步骤3:确认关键字段 需要确认以下字段在到货表中的实际名称: - 到货日期/时间字段:`到货时间` 还是 `arrival_time` 还是 `arrival_date`? - 交接单号字段:`HandoverNumber` 还是 `handover_number` 还是其他? 可以用以下查询检查: ```sql -- 查看到货表的字段结构 DESC arrival_forms; -- 或使用实际的表名 -- 或使用标准SQL查询 SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'lr01mainusa' AND TABLE_NAME = 'arrival_forms' -- 替换为实际表名 ORDER BY ORDINAL_POSITION; ``` ### 步骤4:调整日期条件 原SQL使用 `DATE(CONVERT_TZ(a.到货时间, '+00:00', '-05:00'))` 可能需要调整为: - `DATE(a.arrival_time)` - 如果字段已经是UTC-5 - `DATE(CONVERT_TZ(a.arrival_time, '+00:00', '-05:00'))` - 如果需要时区转换 - `a.arrival_date` - 如果已经是日期类型 --- ## 预期的修复结果 修复完成后,验证SQL应该: - ✅ 能够成功执行 - ✅ 返回1行结果(单行汇总) - ✅ 包含所有关键指标:分母、分子详细拆分等 - ✅ 数值合理(分母 > 0,分子 ≤ 分母或接近) --- ## 备选方案 如果找不到对应的到货表,可能需要: 1. **查询原始SQL中的完整CTE**: - 打开 `LabelReplaceRepository.cs` - 复制 `GetDailyLabelStatsChineseAsync()` 中完整的CTE定义 - 将完整的WITH...AS...CTE部分合并到验证SQL中 2. **简化验证SQL**: - 不使用 `ArrivalFormsWithDate` - 直接从基础表(`label_replace_requests` + `arrival_forms` 或其他)重新构建 --- ## 关键表和字段清单 需要在修复时确认以下信息: | 元素 | 原始假设 | 实际值 | 确认状态 | |------|--------|------|--------| | 到货表 | ArrivalFormsWithDate | ? | 待查 | | 到货日期字段 | 到货时间 | ? | 待查 | | 交接单号字段 | HandoverNumber | ? | 待查 | | 订单表 | label_replace_requests | label_replace_requests | ✓ | | 扫描历史表 | label_scan_history | label_scan_history | ✓ | | 扫描状态表 | OverallScanStatus | ? | 待查 |