SQL技术问询:如何将12张月度表合并为一张年度报表?
问题分析与解决方法
你用INNER JOIN合并月度表的思路完全错了——INNER JOIN是用来关联不同表中具有相同关联键的记录,它要求所有关联的表中都存在同一个ride_id才会返回结果。但骑行数据里,一个ride_id只会对应某一个月的单次骑行,不可能在所有12个月里都出现,所以你的查询自然返回空结果。
要把12张结构相同的月度表合并成一张年度报表,你需要用行堆叠的方式,也就是SQL里的UNION ALL。
正确的SQL写法
假设所有月度表的列结构完全一致(列名、顺序、数据类型都相同),可以直接用UNION ALL把所有表的记录合并:
SELECT * FROM april20 UNION ALL SELECT * FROM may20 UNION ALL SELECT * FROM june20 UNION ALL SELECT * FROM july20 UNION ALL SELECT * FROM aug20 -- 注意你原查询里漏了8月的表,记得补全12个月的所有表 UNION ALL SELECT * FROM sept20 UNION ALL SELECT * FROM oct20 UNION ALL SELECT * FROM nov20 UNION ALL SELECT * FROM dec20 UNION ALL SELECT * FROM jan21 UNION ALL SELECT * FROM feb21 UNION ALL SELECT * FROM mar21 UNION ALL SELECT * FROM april21
关键注意事项
- 如果各月度表的列结构有差异(比如列顺序不同、部分表少列/多列),不要用
SELECT *,要手动指定所有需要的列,确保每个SELECT语句的列数、数据类型、顺序完全一致,示例如下:SELECT ride_id, ride_start_time, ride_end_time, start_station_id, end_station_id FROM april20 UNION ALL SELECT ride_id, ride_start_time, ride_end_time, start_station_id, end_station_id FROM may20 -- 依次补全剩余10张表的SELECT语句 - 优先用
UNION ALL而不是UNION:UNION会自动去重,但会额外消耗性能;如果你的骑行数据里ride_id是全局唯一的(不会跨月重复),UNION ALL足够用,效率更高。 - 合并后可以添加一个额外的列标记每条记录所属的月份,方便后续分析,示例:
SELECT '2020-04' AS month, * FROM april20 UNION ALL SELECT '2020-05' AS month, * FROM may20 -- 其他表依次添加对应月份标记
内容的提问来源于stack exchange,提问作者Justine chapman
相关产品推荐
相关产品推荐

