SQL-聚合函数-1251.平均售价
问题是寻找每种产品的平均售价,平均售价=销售总额/数量。
解题思路:
我们只需要计算出每个产品的销售总额和总数量,总数量可以用UnitSold计算得出,使用GROUP BY和SUM函数即可。
SELECT product_id, SUM(units) FROM UnitsSold GROUP BY product_id
因为每个产品不同时期的售价不同,因此在计算销售总额之前要先分别计算每个价格的销售数量。每个价格的销售总额为对应时间内的价格*对应时间内的数量。因为价格和时间在Prices表中,数量在UnitsSold表中,这两个表通过product_id关联,那么我们可以使用LEFT JOIN将两个表相连,然后使用WHERE查询对应时间内每个产品的价格和数量,并计算对应的销售总额。
SELECT Prices.product_id AS product_id, Prices.price * UnitsSold.units AS sales, UnitsSold.units AS units FROM Prices LEFT JOIN UnitsSold ON Prices.product_id = UnitsSold.product_id AND (UnitsSold.purchase_date BETWEEN Prices.start_date AND Prices.end_date)
计算出产品的每个价格的销售总额之后,同样适用SUM函数计算出产品所有时间的销售总额,然后除以总数量并使用ROUND函数保留两位小数。完整代码如下:
SELECT product_id, IFNULL(Round(SUM(sales) / SUM(units), 2), 0) AS average_price FROM ( SELECT Prices.product_id AS product_id, Prices.price * UnitsSold.units AS sales, UnitsSold.units AS units FROM Prices LEFT JOIN UnitsSold ON Prices.product_id = UnitsSold.product_id AND (UnitsSold.purchase_date BETWEEN Prices.start_date AND Prices.end_date) ) T GROUP BY product_id;
总结:
1. IFNULL
函数用于处理某些产品没有销售记录的情况,确保查询在除法运算涉及到NULL值时仍能返回结果。
2. Round函数四舍五入小数点后两位。
3. Between的使用,BETWEEN
操作符用于检查某个值是否在两个指定的值之间(包括这两个值)。