【LeetCode: SQL专题 : SQL97 返回顾客名称和相关订单号以及每个订单的总和 + 联表查询】

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述
在这里插入图片描述

🚩 题目链接

⛲ 题目描述

Customers 表有字段,顾客名称:cust_name、顾客id:cust_id
在这里插入图片描述
Orders订单信息表,含有字段,订单号:order_num、顾客id:cust_id
在这里插入图片描述
OrderItems表有字段,商品订单号:order_num、商品数量:quantity、商品价格:item_price
在这里插入图片描述
【问题】
除了返回顾客名称和订单号,返回 Customers 表中的顾客名称(cust_name)和Orders 表中的相关订单号(order_num),添加第三列 OrderTotal,其中包含每个订单的总价,并按顾客名称再按订单号对结果进行升序排序。

【示例结果】返回顾客名称 cust_name、订单号order_num、订单总额OrderTotal
在这里插入图片描述
【示例解析】
例如顾客名称cust_name为an的顾客的订单a5的订单总额为quantity*item_price = 15 * 25 = 375,最后以cust_name和order_num来进行升序排序。

🌟 求解思路&实现代码&运行结果


⚡ 联表查询

🥦 求解思路
  1. 核心目标:获取每个顾客的每个订单的总金额,需要输出:

    • 顾客名称 (cust_name)

    • 订单号 (order_num)

    • 该订单的总金额 (OrderTotal,通过订单项的数量和单价计算)

  2. 数据表关联:通过 左连接(LEFT JOIN) 关联三个表:

    • Customers 表:提供顾客名称 (cust_name) 和顾客ID (cust_id)。

    • Orders 表:关联顾客的订单信息,通过 cust_id 与 Customers 表连接。

    • OrderItems 表:提供订单的详细商品信息(数量和单价),通过 order_num 与 Orders 表连接。

  3. 关键步骤

  • 连接表数据:

    • 先连接 Customers 和 Orders,确保所有顾客(即使没有订单)都被保留。

    • 再连接 Orders 和 OrderItems,确保所有订单(即使没有商品项)都被保留。

  • 计算订单总金额:

    • 使用 SUM(quantity * item_price) 计算每个订单的总金额。

    • 按 顾客ID (cust_id)、顾客名称 (cust_name)、订单号 (order_num) 分组,确保每个顾客的每个订单独立统计。

  • 分组与聚合:

    • 分组字段需包含 cust_id 和 cust_name:防止因顾客名称重复导致数据混淆。

    • 分组字段包含 order_num:确保每个订单独立计算总金额。

  • 排序输出:

    • 按 cust_name 升序排列,相同顾客的订单按 order_num 升序排列。
  1. 有了基本的思路,接下来我们就来通过代码来实现一下。
🥦 实现代码
SELECT
    C.cust_name,
    O.order_num,
    SUM(I.quantity * I.item_price) AS OrderTotal
FROM
    Customers AS C
    LEFT JOIN Orders AS O ON C.cust_id = O.cust_id
    LEFT JOIN OrderItems AS I ON O.order_num = I.order_num
GROUP BY
    C.cust_name, C.cust_id, O.order_num
ORDER BY
    C.cust_name,
    O.order_num;

🥦 运行结果

在这里插入图片描述


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硕风和炜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值