题解 | 确定最佳顾客的另一种方式(二)

确定最佳顾客的另一种方式(二)

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中出现,所以必须按它进行分组。

两种方法都可以,选用任意一种即可。

全部评论

相关推荐

团子请爱我一次_十月...:不是戈门,干哪来了,这就是java嘛
点赞 评论 收藏
分享
notbeentak...:真的nc,算毕业6月份,要给这种b公司打半年多白工😅
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务