SQL89 计算总和

174 阅读3分钟

SQL89 计算总和

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情

❤️‍欢迎订阅java厂长《SQL每日一题》 ❤️‍

1、题目📑

OrderItems表代表订单信息,包括字段:订单号 order_num item_price 商品售出价格、quantity 商品数量。

示例:用户信息表user_profile

order_numitem_pricequantity
a110105
a211100
a21200
a421121
a5510
a2119
a775

【问题】编写 SQL 语句,根据订单号聚合,返回订单总价不小于1000 的所有订单号,最后的结果按订单号进行升序排序。

提示:总价 = item_price 乘以 quantity

【示例结果】

order_numtotal_price
a11050
a21319
a42242

示例1

输入:
DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
	order_num VARCHAR(255) NOT NULL COMMENT '商品订单号',
	item_price INT(16) NOT NULL COMMENT '售出价格',
	quantity INT(16) NOT NULL COMMENT '商品数量'
);
INSERT `OrderItems` VALUES ('a1',10,105),('a2',1,1100),('a2',1,200),('a4',2,1121),('a5',5,10),('a2',1,19),('a7',7,5);

输出:
a1|1050.000
a2|1319.000
a4|2242.000

2、思路🧠

问题分解

  • 限定条件:无,本地为过滤条件

  • 根据订单号聚合,使用 group by 函数,对数据按照订单号进行分组。

  • 返回订单总价不小于1000 的所有订单号。 这是一个过滤条件,但是我们很多人这时候会踩坑, 直接这样写SQL语句:

    • where sum(item_price*quantity)>=1000
  • 这里必须使用条件过滤,即having也可以对结果进一步过滤,只不过having必须和group by联合使用。

    • having sum(item_price*quantity)>=1000

解决方法

  • 表头重命名:根据输出示例,正确率用as语法重命名
  • 升序输出: ORDER BY xxx ASC/DESC

注意

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

3、代码👨‍💻

commit AC

SELECT order_num,SUM(item_price * quantity) as total_price
FROM OrderItems
GROUP BY order_num
HAVING total_price >= 1000

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

image-20220809205648833

4、总结

该题目的对SQL的语法及基础知识,学会使用连接,联表等进行查询,where后只能跟表中存在的字段,having 不能单独使用必须搭配group by 联合使用,像内连接、外连接、左连接、右连接等都要有相关的了解,其次当你编写了大量的SQL之后,就要学会进行SQL的优化,这对于数据查询的时间会有大幅度的降低。

❤️‍来自专栏《Mysql每日一题》欢迎订阅❤️‍

厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。

对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!

原题链接:SQL89 计算总和(牛客网)