如何解决SQL中求平均值的问题
SQL中求平均值得问题可能用到的聚合函数: AVG() :求列的平均值 SUM():求和行的和 COUNT():计算行的数目 ROUND():结果保留几位小数,例:ROUND(a,2)保留两位小数
下面看一个例题:
Table: Prices +---------------+---------+ | Column Name | Type | +---------------+---------+ | product_id | int | | start_date | date | | end_date | date | | price | int | +---------------+---------+ (product_id,start_date,end_date) 是 Prices 表的主键。 Prices 表的每一行表示的是某个产品在一段时期内的价格。 每个产品的对应时间段是不会重叠的,这也意味着同一个产品的价格时段不会出现交叉。
Table: UnitsSold +---------------+---------+ | Column Name | Type | +---------------+---------+ | product_id | int | | purchase_date | date | | units | int | +---------------+---------+ UnitsSold 表没有主键,它可能包含重复项。 UnitsSold 表的每一行表示的是每种产品的出售日期,单位和产品 id。
编写SQL查询以查找每种产品的平均售价。 average_price 应该四舍五入到小数点后两位。 查询结果格式如下例所示:
Prices table: +------------+------------+------------+--------+ | product_id | start_date | end_date | price | +------------+------------+------------+--------+ | 1 | 2019-02-17 | 2019-02-28 | 5 | | 1 | 2019-03-01 | 2019-03-22 | 20 | | 2 | 2019-02-01 | 2019-02-20 | 15 | | 2 | 2019-02-21 | 2019-03-31 | 30 | +------------+------------+------------+--------+ UnitsSold table: +------------+---------------+-------+ | product_id | purchase_date | units | +------------+---------------+-------+ | 1 | 2019-02-25 | 100 | | 1 | 2019-03-01 | 15 | | 2 | 2019-02-10 | 200 | | 2 | 2019-03-22 | 30 | +------------+---------------+-------+ Result table: +------------+---------------+ | product_id | average_price | +------------+---------------+ | 1 | 6.96 | | 2 | 16.96 | +------------+---------------+
基本思路: (1)题目要求每种产品的平均售价, 平均售价=产品总价/销售的产品数量 (2)这里要注意的是同一个产品不同时间的售价是不一样,这就需要我们根据购买产品的日期得到该产品的售价,这里利用连接查询得到,然后再根据产品分组,计算每个产品的平均售价。
代码如下
select u.product_id, round(sum(u.units*p.price)/sum(u.units),2) as average_price from UnitsSold u join Prices p on (u.product_id=p.product_id and u.purchase_date>=p.start_date and u.purchase_date<=p.end_date) group by u.product_id
