最近做了京东的24年春招题,题目如下:

alt

题目分析

本题要求统计每个线下商家的销售总额、退款总额和平均满意度分数,并输出商家ID、商家名称、销售总额、退款总额、平均满意度分数。
输出字段

  • merchant_id(商家ID)
  • merchant_name(商家名称)
  • total_sales_amount(销售总额)
  • total_refund_amount(退款总额)
  • average_satisfaction_score(平均满意度分数,保留两位小数)

输出顺序:题目未指定排序,默认按商家ID升序输出。
涉及知识点

  • SQL 多表连接(JOIN)
  • 子查询与聚合(SUM、COUNT、ROUND)
  • 分组统计(GROUP BY)
  • 字段别名

解答步骤

  1. 统计每个商家的销售总额

    • 通过 sales_underline 表,按 merchant_id 分组,计算每个商家的销售总额(sum(sale_amount))。
    • 用子查询实现,并与主表 merchants_underline 连接。
  2. 统计每个商家的退款总额

    • 通过 refunds_underline 表,按 merchant_id 分组,计算每个商家的退款总额(sum(refund_amount))。
    • 用子查询实现,并与主表连接。
  3. 统计每个商家的平均满意度分数

    • 通过 satisfaction_underline 表,按 merchant_id 分组,计算每个商家的平均满意度分数(sum(satisfaction_score)/count(*)),并用 ROUND(..., 2) 保留两位小数。
    • 用子查询实现,并与主表连接。
  4. 主查询整合所有信息

    • merchants_underline 为主表,分别与上述三个子查询通过 merchant_id 连接,输出所需字段。
  • 多表聚合子查询
    本题的难点在于需要对不同的表分别聚合(销售、退款、满意度),再通过主表将结果整合。
    例如,销售总额子查询:
select m.merchant_id as merchant_id, sum(s.sale_amount) as total_sales_amount
from merchants_underline m
left join sales_underline s on m.merchant_id = s.merchant_id
group by merchant_id

这样可以保证每个商家即使没有销售记录也能被统计(用左连接)。

完整代码

select 
    m.merchant_id,
    m.merchant_name,
    s.total_sales_amount,
    r.total_refund_amount,
    su.average_satisfaction_score
from merchants_underline m
left join (
    select m.merchant_id as merchant_id, sum(s.sale_amount) as total_sales_amount
    from merchants_underline m
    join sales_underline s on m.merchant_id = s.merchant_id 
    group by merchant_id
) s on m.merchant_id = s.merchant_id 
left join (
    select m.merchant_id as merchant_id, sum(r.refund_amount) as total_refund_amount
    from merchants_underline m
    join refunds_underline r on m.merchant_id = r.merchant_id 
    group by merchant_id
) r on m.merchant_id = r.merchant_id 
left join (
    select m.merchant_id as merchant_id, round(sum(su.satisfaction_score)/count(*), 2) as average_satisfaction_score
    from merchants_underline m
    join satisfaction_underline su on m.merchant_id = su.merchant_id 
    group by merchant_id
) su on m.merchant_id = su.merchant_id 

近似题目练习推荐

牛客的课程订单分析(七)

  • 知识点:左连接、分组和排序、子查询

如需更多类似题目,可在牛客网SQL练习区搜索“多表连接”、“分组聚合”等关键词进行练习。