23. 销售额完成任务指标的商品

题目需求

商家要求每个商品每个月需要售卖出一定的销售总额
假设1号商品销售总额大于21000,2号商品销售总额大于10000,其余商品没有要求
请写出SQL从订单详情表中(order_detail)查询连续两个月销售总额大于等于任务总额的商品

期望结果如下:

sku_id

(商品id)
1

需要用到的表:

订单明细表:order_detail

order_detail_id(订单明细id)order_id(订单id)sku_id(商品id)create_date(下单日期)price(商品单价)sku_num(商品件数)
1112021-09-302000.002
2132021-09-305000.005
存在的疑问

在这里插入图片描述

实现一
-- 实现1-1 : 2)、3) 较难理解  --> 请看实现1-2

select sku_id
from (
-- 4) 选择出 (create_date_for 与 create_date_for_last 相差一个月) 的记录
         select sku_id,
                sum_price,
                sum_price_last,
                -- 5) 判断是否连续两个月的销售总额是否达到要求。1: 达到; 0: 未达到。
                case
                    when sku_id = 1 and sum_price >= 21000 and sum_price_last >= 21000 then 1
                    when sku_id = 2 and sum_price >= 10000 and sum_price_last >= 10000 then 1
                    else 0
                    end as whether_ok
         from (
                  -- 1) 统计 1号 2号 商品每个月的销售总额
                  select sku_id,
                         date_format(create_date, 'yyyy-MM')                                             create_date_for,
                         sum(price)                                                                      sum_price,
                         -- 2) 获取下一次销售月份, 如果为null,则默认使用 '9999-99'
                         lead(date_format(create_date, 'yyyy-MM'), 1, '9999-99')
                              over (partition by sku_id order by date_format(create_date, 'yyyy-MM')) as create_date_for_last,
                         -- 3) 获取下一次销售月份的销售总额, 如果为null,则默认使用 0
                         -- 注: 此处的 sum(price) 是计算的下一组的 销售总额
                         lead(sum(price), 1, 0.00)
                              over (partition by sku_id order by date_format(create_date, 'yyyy-MM')) as sum_price_last
                  from order_detail
                  where sku_id in (1, 2)
                        --  这里 date_format(create_date, 'yyyy-MM') 被视为一个整体
                  group by sku_id, date_format(create_date, 'yyyy-MM')
              ) t1
         where datediff(concat(create_date_for_last, '-01'), concat(create_date_for, '-01')) <= 31
     ) t2
where whether_ok = 1;


-- 实现1-2

select sku_id
from (
-- 4) 选择出 (create_date_for 与 create_date_for_last 相差一个月) 的记录
         select sku_id,
                sum_price,
                sum_price_last,
                -- 5) 判断是否连续两个月的销售总额是否达到要求。1: 达到; 0: 未达到。
                case
                    when sku_id = 1 and sum_price >= 21000 and sum_price_last >= 21000 then 1
                    when sku_id = 2 and sum_price >= 10000 and sum_price_last >= 10000 then 1
                    else 0
                    end as whether_ok
         from (
                  select sku_id,
                         create_date_for,
                         sum_price,
                         -- 2) 获取下一次销售月份, 如果为null,则默认使用 '9999-99'
                         lead(create_date_for, 1, '9999-99')
                              over (partition by sku_id order by create_date_for)                     as create_date_for_last,
                         -- 3) 获取下一次销售月份的销售总额, 如果为null,则默认使用 0
                         lead(sum_price, 1, 0.00) over (partition by sku_id order by create_date_for) as sum_price_last
                  from (
                           -- 1) 统计 1号 2号 商品每个月的销售总额
                           select sku_id,
                                  date_format(create_date, 'yyyy-MM') create_date_for,
                                  sum(price)                          sum_price
                           from order_detail
                           where sku_id in (1, 2)
                                 --  这里 date_format(create_date, 'yyyy-MM') 被视为一个整体
                           group by sku_id, date_format(create_date, 'yyyy-MM')
                       ) t1
              ) t2
         where datediff(concat(create_date_for_last, '-01'), concat(create_date_for, '-01')) <= 31
     ) t3
where whether_ok = 1;
题目来源

http://practice.atguigu.cn/#/question/23/desc?qType=SQL

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dataer__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值