题解 | 确定最佳顾客的另一种方式(二)
确定最佳顾客的另一种方式(二)
https://www.nowcoder.com/practice/b5766f970ae64ac7944f37f5b47107aa
思路分析:
三表连接,分别通过cust_id和order_num进行连接,将每位顾客的信息、订单情况、订单金额都连接到一起,然后根据OrderItems表中信息按order_num进行分组聚合,筛选出总金额在1000及以上的订单,返回相应的数据。
代码解释:
SELECT cust_name, total_price FROM Orders JOIN Customers ON Orders.cust_id = Customers.cust_id JOIN ( SELECT order_num, SUM(item_price * quantity) AS total_price FROM OrderItems GROUP BY order_num HAVING total_price >= 1000 ) AS OI ON OI.order_num = Orders.order_num ORDER BY total_price;
从代码的角度来说有两种写法,一种是在连接的时候就使用嵌套查询,如上所示,构建临时表,提前将OrderItems中的数据进行分组聚合,求出每个订单的总金额,同时筛选出金额在1000及以上的组,注意对分组的筛选只能写在HAVING子句中,不能写到WHERE子句中去,HAVING是对GROUP BY分组之后的数据进行筛选,而WHERE是在GROUP BY之前执行的,GROUP BY针对WHERE筛选后的数据进行分组,各个子句的作用及执行顺序要清楚,不能用混。total_price列别名是可以在HAVING子句中直接使用的。最后用这个分组聚合后的表参与连接,选取所需的列即可。
另外一种写法就是不使用嵌套查询,直接三个表进行连接,连接以后GROUP BY cust_name HAVING total_price >= 1000,在SELECT子句中用SUM(item_price * quantity) AS total_price,注意一定要GROUP BY cust_name,不能是其他列,因为cust_name需要在SELECT中出现,所以必须按它进行分组。
两种方法都可以,选用任意一种即可。