代码编织梦想

力扣高频SQL 50题(基础版)第十六题

1251. 平均售价

题目说明

表:Prices

±--------------±--------+ | Column Name | Type | ±--------------±--------+ | product_id | int | | start_date | date | | end_date | date | | price | int | ±--------------±--------+ (product_id,start_date,end_date) 是 prices 表的主键(具有唯一值的列的组合)。 prices 表的每一行表示的是某个产品在一段时期内的价格。 每个产品的对应时间段是不会重叠的,这也意味着同一个产品的价格时段不会出现交叉。

表:UnitsSold

±--------------±--------+

| Column Name | Type |

±--------------±--------+

| product_id | int |

| purchase_date | date |

| units | int |

±--------------±--------+

该表可能包含重复数据。

该表的每一行表示的是每种产品的出售日期,单位和产品 id。

编写解决方案以查找每种产品的平均售价。average_price 应该 四舍五入到小数点后两位

返回结果表 无顺序要求

思路分析

在这里插入图片描述

实现过程

准备数据
Create table If Not Exists Prices (product_id int, start_date date, end_date date, price int)
Create table If Not Exists UnitsSold (product_id int, purchase_date date, units int)
Truncate table Prices
insert into Prices (product_id, start_date, end_date, price) values ('1', '2019-02-17', '2019-02-28', '5')
insert into Prices (product_id, start_date, end_date, price) values ('1', '2019-03-01', '2019-03-22', '20')
insert into Prices (product_id, start_date, end_date, price) values ('2', '2019-02-01', '2019-02-20', '15')
insert into Prices (product_id, start_date, end_date, price) values ('2', '2019-02-21', '2019-03-31', '30')
Truncate table UnitsSold
insert into UnitsSold (product_id, purchase_date, units) values ('1', '2019-02-25', '100')
insert into UnitsSold (product_id, purchase_date, units) values ('1', '2019-03-01', '15')
insert into UnitsSold (product_id, purchase_date, units) values ('2', '2019-02-10', '200')
insert into UnitsSold (product_id, purchase_date, units) values ('2', '2019-03-22', '30')
实现方式
#要考虑到空值的情况
select p.product_id, ifnull(round(sum(price * units) / sum(units), 2), 0) as average_price
from Prices p 
left join UnitsSold u on u.product_id = p.product_id
and u.purchase_date between p.start_date and p.end_date
group by p.product_id
结果截图

在这里插入图片描述

总结
ifnull(round(sum(price * units) / sum(units), 2), 0)

这个表达式首先计算 price 和 units 的乘积的总和,然后除以 units 的总和,得到平均价格。

使用 round 函数将结果四舍五入到小数点后两位。

ifnull 函数检查 round 的结果。如果结果为 NULL(这在正常情况下不太可能发生,除非 sum(price * units) 和 sum(units) 都是 NULL),则返回 0。

if(round(sum(price * units) / sum(units) is null, 2), 0, round(sum(price * units) / sum(units)))

这个表达式看起来有语法错误。正确的 IF 函数语法应该是 IF(condition, true_value, false_value)。

假设表达式是 if(round(sum(price * units) / sum(units), 2) is null, 0, round(sum(price * units) / sum(units), 2)),那么它的意思是:首先计算平均价格,并四舍五入到小数点后两位。

然后检查这个四舍五入后的结果是否为 NULL。如果是 NULL,则返回 0;否则返回四舍五入后的结果。

its), 2)),那么它的意思是:首先计算平均价格,并四舍五入到小数点后两位。

然后检查这个四舍五入后的结果是否为 NULL。如果是 NULL,则返回 0;否则返回四舍五入后的结果。

但是,由于 round 函数的结果不可能是 NULL,除非 sum(price * units) 或 sum(units) 为 0 导致除以 0 的情况,这个 IF 条件实际上是多余的

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_70882914/article/details/140718210

LeetCode-1251. 平均售价(简单)-爱代码爱编程

Table: Prices +---------------+---------+ | Column Name   | Type    | +---------------+---------+ | product_id    | int     | | start_date    | date    | | end_date      | date  

mysql查询-爱代码爱编程

一、准备工作 创建数据库select_database创建数据表product并插入数据#创建数据库 CREATE DATABASE select_database; #切换数据库 USE select_database; #创建商品表 CREATE TABLE product( pid INT PRIMARY KEY, pname VARCHAR(

如何解决SQL中求平均值的问题-爱代码爱编程

SQL中求平均值得问题可能用到的聚合函数: AVG() :求列的平均值 SUM():求和行的和 COUNT():计算行的数目 ROUND():结果保留几位小数,例:ROUND(a,2)保留两位小数 下面看一个例题: Table: Prices +---------------+---------+ | Column Name | Type

Easy之1251.平均售价-爱代码爱编程

Table: Prices Column NameTypeproduct_idintstart_datedateend_datedatepriceint(product_id,start_date,end_date) 是 Prices 表的主键。 Prices 表的每一行表示的是某个产品在一段时期内的价格。 每个产品的对应时间段是不会重叠的,这也意味着同

【LeetCode 1251】平均售价 (SQL)-爱代码爱编程

一、题目 Table: Prices +---------------+---------+ | Column Name   | Type    | +---------------+---------+ | product_id    | int     | | start_date    | date    | | end_date      |

每日一题-73(平均售价)-爱代码爱编程

题73: 根据下面两个表编写SQL查询以查找每种产品的平均售价,其中average_price 应该四舍五入到小数点后两位。 其中: Prices表:(product_id,start_date,end_date) 是 Prices 表的主键;Prices 表的每一行表示的是某个产品在一段时期内的价格;每个产品的对应时间段是不会重叠的,这也意味着同一个

Leetcode SQL会员题【吐血总结~~】第四天-爱代码爱编程

目录 1173. 即时食物配送 I1174. 即时食物配送 II1193. 每月交易 I1194. 锦标赛优胜者1204. 最后一个能进入电梯的人1205. 每月交易II1211. 查询结果的质量和占比1212. 查询球队积分1225. 报告系统状态的连续日期1241. 每个帖子的评论数1251. 平均售价1264. 页面推荐1270. 向公司CEO汇报

题目:1251.平均售价-爱代码爱编程

​ ​题目来源:         leetcode题目,网址:1251. 平均售价 - 力扣(LeetCode) 解题思路:         首先根据产品 id 和 销售日期连接两表,然后根据产品 id 分组聚合,最后计算结果。 解题代码: # Write your MySQL query statement below select dist

sql-每日一题【1251. 平均售价】-爱代码爱编程

题目 Table: Prices Table: UnitsSold   编写SQL查询以查找每种产品的平均售价。average_price 应该四舍五入到小数点后两位。 查询结果格式如下例所示:       解题思路 1.题目要求查询每种产品的平均售价。给出了两个表,我们用聚合查询来解决此问题。 2.首先我们将两个表做连接,

leetcode 1251. 平均售价_狗狗狗狗狗乐啊的博客-爱代码爱编程

题目链接:1251. 平均售价 题目描述 表:Prices Column NameTypeproduct_idintstart_datedateend_datedatepriceint (product_id,

sql练习 -爱代码爱编程

表:Prices +---------------+---------+ | Column Name | Type | +---------------+---------+ | product_id | int | | start_date | date | | end_date | date | |

力扣-爱代码爱编程

一、题目 二、代码 # Write your MySQL query statement below select Prices.product_id, coalesce(round(sum(price*units