如何解决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
经验分享 程序员 微信小程序 职场和发展