欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > MySQL练手 --- 1251. 平均售价

MySQL练手 --- 1251. 平均售价

2024/11/30 10:48:35 来源:https://blog.csdn.net/ckk1314520/article/details/140670050  浏览:    关键词:MySQL练手 --- 1251. 平均售价

题目链接:1251. 平均售价

思路:

由题意可知,Prices表和UnitsSold表,表的连接关系为一对一,连接字段(匹配字段)为product_id

要求:查找每种产品的平均售价。而Prices表含有价格还有价格的时间限制却没有产品出售的数量,UnitsSold表含有产品出售的日期以及产品出售的数量。

有的产品定了价但没有卖出去,这种也得算出产品的平均售价。(平均售价标记为0)所以使用左连接将Prices表和UnitsSold表连接起来,编写相应的过滤条件即可。

解题过程:

题目要求:查找每种产品的平均售价
Prices表和UnitsSold表进行左连接

SELECT *
FROM prices p
LEFT JOIN unitssold u
ON p.product_id = u.product_id;

在这里插入图片描述
看第一条记录,product_id 为1的产品,定价为5,截止时间从2019-02-172019-02-28,可是产品却在2019-03-01出售过,很明显不符合常理,所以再增加过滤条件u.purchase_date BETWEEN p.start_date AND,变为p.product_id = u.product_id AND u.purchase_date BETWEEN p.start_date AND p.end_date

SELECT *
FROM prices p
LEFT JOIN unitssold u
ON p.product_id = u.product_id AND u.purchase_date BETWEEN p.start_date  AND p.end_date;

在这里插入图片描述
然后就是对其进行分组,计算每种产品的平均售价

按产品 id 进行分组(GROUP BY p.product_id),计算平均售价,SUM(p.price * u.units) / SUM(u.units)

题目要求平均售价的结果 应该 四舍五入到小数点后两位。所以再使用ROUND函数

又因为,有的产品定了价但没有卖出去,这种也得算出产品的平均售价,所以最后使用IFNULL函数对其判断是否为NULL

Code

SELECT p.product_id, IFNULL(ROUND(SUM(p.price * u.units) / SUM(u.units),2),0) average_price 
FROM prices p
LEFT JOIN unitssold u
ON p.product_id = u.product_id AND u.purchase_date BETWEEN p.start_date  AND p.end_date
GROUP BY p.product_id;

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com