SQL30计算总和思路详解
计算总和
https://www.nowcoder.com/practice/d8a624021183454586da94d280cc8046?tpId=298&tags=&title=&difficulty=0&judgeStatus=0&rp=0
做这道题之前,先回顾一下MySQL的知识点
- where条件语句后面不能加聚合函数(分组函数)
- having 不能单独使用,必须和group by 联合使用
解题思路
题目要求:
根据订单号聚合,返回订单总价不小于1000 的所有订单号,总价 = item_price 乘以 quantity。
- 其实题目已经暗示得很清楚了:根据订单号聚合,这不就摆明叫我们使用 group by 函数,对数据按照订单号进行分组吗?
- 返回订单总价不小于1000 的所有订单号。 这是一个过滤条件,但是我们很多人这时候会踩坑, 直接这样写SQL语句:
where sum(item_price*quantity)>=1000
咋一看这好像没问题。但是别忘记了:where后面不能加聚合函数!!!!!
那有没有别的办法呢? 别忘记了我们的老大哥:having
having也可以对结果进一步过滤,只不过having必须和group by联合使用。
having sum(item_price*quantity)>=1000
这样一来,就符合了MySQL的语法规则。
- 对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;
别忘记对结果进行排序。
总结
- where后面不能直接加聚合函数(分组函数),我们也可以这样记忆:where后面只能跟表中存在的字段。
- 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的子查询,大家就当做知识的回顾。