题目链接: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-17
到2019-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;