🚀 算法题 🚀 |
🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,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来进行升序排序。
🌟 求解思路&实现代码&运行结果
⚡ 联表查询
🥦 求解思路
-
核心目标:获取每个顾客的每个订单的总金额,需要输出:
-
顾客名称 (cust_name)
-
订单号 (order_num)
-
该订单的总金额 (OrderTotal,通过订单项的数量和单价计算)
-
-
数据表关联:通过 左连接(LEFT JOIN) 关联三个表:
-
Customers 表:提供顾客名称 (cust_name) 和顾客ID (cust_id)。
-
Orders 表:关联顾客的订单信息,通过 cust_id 与 Customers 表连接。
-
OrderItems 表:提供订单的详细商品信息(数量和单价),通过 order_num 与 Orders 表连接。
-
-
关键步骤
-
连接表数据:
-
先连接 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 升序排列。
- 有了基本的思路,接下来我们就来通过代码来实现一下。
🥦 实现代码
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;
🥦 运行结果
💬 共勉
最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉! |