最近做了携程的25年春招题,题目如下:
题目分析
本题要求统计2024年旅行总费用超过10000元的客户信息,包括客户姓名、总旅行费用、订单数量和平均订单价格。
输出字段:
- customer_name(客户姓名)
- total_travel_cost(总旅行费用)
- order_count(订单数量)
- avg_order_price(平均订单价格,保留两位小数)
输出顺序:按总旅行费用降序(total_travel_cost desc)。
涉及知识点:
- SQL 多表连接(JOIN)
- 条件筛选(WHERE + year())
- 分组聚合(SUM、COUNT、AVG、GROUP BY)
- 分组后筛选(HAVING)
- 字段别名与排序(ORDER BY)
- ROUND函数
解答步骤
1. 关联预订、套餐和客户信息
- 用
bookings
预订表与packages
套餐表通过套餐ID连接,获取套餐价格。 - 再与
customers
客户表通过客户ID连接,获取客户姓名。
from bookings b
join packages p on p.id = b.package_id
join customers c on c.id = b.customer_id
2. 筛选2024年的预订记录
- 只保留2024年内的预订记录。
where year(b.booking_date) = 2024
3. 按客户分组统计
- 按客户姓名分组,统计:
- 总旅行费用:
sum(p.price)
- 订单数量:
count(*)
- 平均订单价格:
round(avg(p.price),2)
- 总旅行费用:
group by c.name
4. 筛选总费用超过10000元的客户
- 只保留总旅行费用大于10000元的客户。
having sum(p.price) > 10000
5. 排序输出
- 按总旅行费用降序排序。
order by total_travel_cost desc
完整代码
select c.name as customer_name,
sum(p.price) as total_travel_cost,
count(*) as order_count,
round(avg(p.price),2) as avg_order_price
from bookings b
join packages p on p.id = b.package_id
join customers c on c.id = b.customer_id
where year(b.booking_date) = 2024
group by c.name
having sum(p.price) > 10000
order by total_travel_cost desc
近似题目练习推荐
- 知识点:多表连接、分组聚合
- 知识点:分组统计、聚合函数、条件筛选
如需更多类似题目,可在牛客网SQL练习区进行练习。