SQL-聚合函数-1251.平均售价

发布时间 2023-11-30 05:12:35作者: Offer多多

问题是寻找每种产品的平均售价,平均售价=销售总额/数量。

解题思路:

我们只需要计算出每个产品的销售总额和总数量,总数量可以用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 操作符用于检查某个值是否在两个指定的值之间(包括这两个值)。