当前位置:   article > 正文

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

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;
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述
看第一条记录,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;
  • 1
  • 2
  • 3
  • 4

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

按产品 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;
  • 1
  • 2
  • 3
  • 4
  • 5
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/903282
推荐阅读
相关标签
  

闽ICP备14008679号