SQL30计算总和思路详解

计算总和

https://www.nowcoder.com/practice/d8a624021183454586da94d280cc8046?tpId=298&tags=&title=&difficulty=0&judgeStatus=0&rp=0

做这道题之前,先回顾一下MySQL的知识点

  1. where条件语句后面不能加聚合函数(分组函数)
  2. having 不能单独使用,必须和group by 联合使用

解题思路

题目要求:

根据订单号聚合,返回订单总价不小于1000 的所有订单号,总价 = item_price 乘以 quantity。

  1. 其实题目已经暗示得很清楚了:根据订单号聚合,这不就摆明叫我们使用 group by 函数,对数据按照订单号进行分组吗?
  2. 返回订单总价不小于1000 的所有订单号。 这是一个过滤条件,但是我们很多人这时候会踩坑, 直接这样写SQL语句:
where sum(item_price*quantity)>=1000

咋一看这好像没问题。但是别忘记了:where后面不能加聚合函数!!!!!

那有没有别的办法呢? 别忘记了我们的老大哥:having

having也可以对结果进一步过滤,只不过having必须和group by联合使用。

having sum(item_price*quantity)>=1000

这样一来,就符合了MySQL的语法规则。

  1. 对1、2两点进行整合,我们就可以写出完整的SQL语句啦。
select order_num,sum(item_price*quantity) total_price 
from OrderItems 
group by order_num 
having sum(item_price*quantity)>=1000 
order by order_num;

别忘记对结果进行排序。

总结

  1. where后面不能直接加聚合函数(分组函数),我们也可以这样记忆:where后面只能跟表中存在的字段。
  2. having 不能单独使用,必须跟 group by 联合使用。

本题的另外一种解法

 select order_num,total_price from 
 (select order_num,sum(item_price*quantity) total_price from OrderItems 
 group by order_num) t
 where total_price>=1000 order by order_num;

这种解法主要是使用了from的子查询,大家就当做知识的回顾。

全部评论
楼主,第一种解法having部分的过滤条件可以直接使用前面定义的别名,不用再写一遍聚合函数了
6 回复 分享
发布于 2022-04-25 17:03
第二个方法里面 那个单独的t什么意识啊 AS 的意识吗
点赞 回复 分享
发布于 2022-04-06 17:37
北京农商银行
校招火热招聘中
官网直投
求问写sum(quantity) * item_price为什么会报错?
点赞 回复 分享
发布于 2022-04-08 19:40
楼主我爱死你了😘
点赞 回复 分享
发布于 01-29 15:51 甘肃

相关推荐

169 15 评论
分享
牛客网
牛客企业服务