题目:销售分析III
需求:
编写一个SQL查询,报告2019年春季才售出的产品。即仅在2019-01-01至2019-03-31(含)之间出售的商品。
以 任意顺序 返回结果表。
查询结果格式如下所示。
ps:
第一次遇到解决范围问题的sql,有点懵,参考了力扣各位大佬的思路,分享两种方法进行解题
方法1
使用到的函数与方法
- group by 分组函数
- sum 求和
- count 统计(不会统计null)
- having 一般配置group by 使用,作为分组之后的条件
思路:
将 Sales 按照 product_id 进行分组,判断每一组中sum(sale_date ) 在春季出售2019-01-01至2019-03-31(含)之间的商品 与该组哦那总条数是否相等,因为 如果sale_date 在 between and 区间会返回1 不在返回0 ,但是count 会将所有分组的数量进行统计,这样就可以取得我们想要的区间了
sql
select p.product_id ,p.product_name from product p left join sales s on
p.product_id =s.product_id group by s.product_id having
sum(s.sale_date between '2019-01-01' and '2019-03-31')=count(*)
方法2 :使用补集的思想
第一步:分析题目要求,求在春季销售的商品,就是一个区间,仅在这个时间段内。如果既在这个时间段也在其他时间段,则不符合要求解的情况; 总结了三个限制条件
- 最明显的:出售日期在某一时间段内;
- 仅在这个时间段内。如果既在这个时间段也在其他时间段,则不符合要求解的情况;
- 必须有出售记录。有些商品可能还没有出售记录,即根本未出现在sales表中。
第二步:使用 in 与 not in 做补集,in 是 product 表中 product_id 在sales 表中的 product_id ; not in 不在 where sale_date < '2019-01-01' or sale_date > '2019-03-31' 非春季的范围,进行排除,最后输出结果
sql:
select product_id, product_name
from product
where product_id not in (
select s.product_id
from sales s
where sale_date < '2019-01-01' or sale_date > '2019-03-31'
)
and product_id in (
select s.product_id
from sales s
)