请求协助:开发基于计划与实际销售线路表的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
相关产品推荐
相关产品推荐

