编写SQL查询:从booking与shipment_log表获取订单的价格、收发地址及价格差异
解决方案
没问题,我来帮你搞定这个SQL查询需求~先理清楚核心逻辑:我们需要从booking表拿订单的基础价格,再关联shipment_log表获取运单的取送货地点,还要计算价格差异。不过有个小细节,你给出的shipment_log表结构里没包含价格相关字段,但题目说运单更新记录存在这个表,所以我默认shipment_log里有个updated_price字段存更新后的价格(要是实际字段名不一样,你直接替换就行)。
最终SQL查询语句
SELECT b.booking_id, b.price AS original_price, -- 拼接成完整的取货地点(城市+州) CONCAT(sl.pickup_city, ', ', sl.pickup_state) AS pickup_location, sl.delivery_city AS delivery_location, -- 计算价格差异:更新后价格减去原订单价格,无更新记录则显示NULL sl.updated_price - b.price AS price_difference FROM booking b LEFT JOIN shipment_log sl ON b.booking_id = sl.booking_id -- 可选:如果一个订单有多条更新记录,取最新的那一条 -- QUALIFY ROW_NUMBER() OVER (PARTITION BY b.booking_id ORDER BY sl.log_id DESC) = 1;
关键细节说明
- 关联方式选择:用
LEFT JOIN是为了保证所有订单都能被返回,哪怕某个订单还没有任何更新记录(这种情况下取货地点、送货地点和价格差异会显示为NULL)。 - 取货地点格式化:用
CONCAT把城市和州拼接成更易读的完整地址,你可以根据需求调整分隔符(比如改成空格或者其他格式)。 - 价格差异逻辑:如果
shipment_log里的价格字段不是updated_price,记得替换成实际的字段名;要是业务里价格差异的计算逻辑不同(比如原价格减更新后价格),直接调整减法顺序就行。 - 多更新记录处理:如果一个订单有多次更新,上面的查询会返回所有历史记录。要是只需要最新的一条更新信息,把注释里的窗口函数语句去掉注释就行(
log_id是自增主键的话,按它倒序取第一条就是最新记录)。
内容的提问来源于stack exchange,提问作者Yash M
相关产品推荐
相关产品推荐

