You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助:开发基于计划与实际销售线路表的SQL合并查询

合并计划与实际行程数据的SQL方案思路

Hey there! 要搞定这两张表的数据合并,得先明确几个关键信息才能写出精准的SQL,但先给你一套通用的框架和常见场景的实现方式,你可以根据实际情况调整:

首先,得明确的核心信息(方便优化方案)

  • 两张表的具体字段结构:比如计划线路表是否有线路ID、计划日期、计划站点、负责销售人员ID这些字段?实际覆盖表对应的字段是什么?
  • 你需要的合并逻辑:是要展示所有计划行程+匹配的实际行程(左连接)?还是只展示有实际覆盖的计划行程?或者要把计划和实际的记录都列出来(全连接)?
  • 是否需要数据聚合:比如统计每个销售人员的计划完成率,或者对比计划站点和实际覆盖站点的差异?

通用示例(假设常见字段结构)

假设两张表的结构如下:

  • 计划线路表(plan_routes):route_id, salesman_id, plan_date, planned_stations(逗号分隔的站点列表)
  • 实际覆盖表(actual_routes):actual_id, salesman_id, actual_date, covered_stations, cover_time

场景1:关联展示每个计划对应的实际行程(左连接)

这个场景会保留所有计划行程,匹配到对应的实际记录,没有实际覆盖的会显示NULL:

SELECT
    p.route_id,
    p.salesman_id,
    p.plan_date,
    p.planned_stations,
    a.covered_stations,
    a.cover_time
FROM plan_routes p
LEFT JOIN actual_routes a
    ON p.salesman_id = a.salesman_id
    AND p.plan_date = a.actual_date
ORDER BY p.plan_date, p.salesman_id;

场景2:对比计划与实际的站点差异(以MySQL为例)

如果需要找出每个销售人员某天没覆盖的计划站点,可以用字符串函数处理:

SELECT
    p.salesman_id,
    p.plan_date,
    p.planned_stations,
    a.covered_stations,
    -- 计算未覆盖的站点(需确保站点格式一致)
    TRIM(BOTH ',' FROM REPLACE(p.planned_stations, a.covered_stations, '')) AS uncovered_stations
FROM plan_routes p
JOIN actual_routes a
    ON p.salesman_id = a.salesman_id
    AND p.plan_date = a.actual_date
WHERE p.planned_stations != a.covered_stations;

场景3:全量展示计划和实际记录(模拟全连接)

如果需要把所有计划和所有实际记录都列出来(不管有没有匹配),MySQL可以用UNION模拟全连接:

-- 左连接获取所有计划+匹配的实际
SELECT
    p.route_id,
    p.salesman_id,
    p.plan_date AS record_date,
    p.planned_stations,
    a.covered_stations,
    'PLAN' AS record_type
FROM plan_routes p
LEFT JOIN actual_routes a
    ON p.salesman_id = a.salesman_id
    AND p.plan_date = a.actual_date

UNION

-- 右连接获取所有未匹配计划的实际记录
SELECT
    p.route_id,
    a.salesman_id,
    a.actual_date AS record_date,
    p.planned_stations,
    a.covered_stations,
    'ACTUAL' AS record_type
FROM plan_routes p
RIGHT JOIN actual_routes a
    ON p.salesman_id = a.salesman_id
    AND p.plan_date = a.actual_date
WHERE p.route_id IS NULL;

如果你的表结构或需求和上面的示例不一样,把具体的字段和合并规则告诉我,我再帮你调整SQL语句!

内容的提问来源于stack exchange,提问作者Yasser Bouaichi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:21:48