1251. 平均售价(left join on后面加条件和where 后面加条件的区别、nvl()函数的使用)
1251. 平均售价
知识点:
1、left join on后面加条件和where 后面加条件的区别。
- 数据库在通过连接两张表来返回记录时,都会生成一张中间的临时表,然后载将这张临时表返回给用户。
- 在使用left join 时,on 和where 条件区别如下:
a.on是在生成临时表的时候生成的条件,她不管oN的条件是否为真,都会返回左边表中的记录。用left join on 进行过滤的时候,on 条件只会对右表进行条件过滤,不会对左表有任何影响。
b.where 条件是在生成临时表后,再对临时表进行过滤的条件。这是已经没有了left join 的含义(必须返回左表记录了)。where 会对结果集产生影响,所以会对左表产生影响。
2、nvl()函数与ifNull()函数的详解。
nvl(a,b)如果a不为null ,那么就取a。a为null ,那么就取b。
ORCLE
/* 解题思路:首先确定第二张表的产品的他们的售价,
就需要按照id 和售出时间来来关联价格表,得到该产品在对应时间段的售卖的价格 */
select c.product_id,round(nvl(sum(c.total)/sum(units),0),2) average_price from
(select a.product_id,price*units total,b.units from prices a left join unitssold b on a.product_id=b.product_id and (b.purchase_date between a.start_date and a.end_date)
) c
group by c.product_id
MYSQL
select a.product_id,
ifNULL(round(sum(units*price)/sum(units),2),0) average_price
from prices a left join unitssold b on a.product_id=b.product_id
and (b.purchase_date between a.start_date and a.end_date)
group by a.product_id