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-2select sku_id
from (
-- 4) 选择出 (create_date_for 与 create_date_for_last 相差一个月) 的记录select sku_id,sum_price,sum_price_last,-- 5) 判断是否连续两个月的销售总额是否达到要求。1: 达到; 0: 未达到。casewhen sku_id = 1 and sum_price >= 21000 and sum_price_last >= 21000 then 1when sku_id = 2 and sum_price >= 10000 and sum_price_last >= 10000 then 1else 0end as whether_okfrom (-- 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_lastfrom order_detailwhere sku_id in (1, 2)--  这里 date_format(create_date, 'yyyy-MM') 被视为一个整体group by sku_id, date_format(create_date, 'yyyy-MM')) t1where datediff(concat(create_date_for_last, '-01'), concat(create_date_for, '-01')) <= 31) t2
where whether_ok = 1;-- 实现1-2select sku_id
from (
-- 4) 选择出 (create_date_for 与 create_date_for_last 相差一个月) 的记录select sku_id,sum_price,sum_price_last,-- 5) 判断是否连续两个月的销售总额是否达到要求。1: 达到; 0: 未达到。casewhen sku_id = 1 and sum_price >= 21000 and sum_price_last >= 21000 then 1when sku_id = 2 and sum_price >= 10000 and sum_price_last >= 10000 then 1else 0end as whether_okfrom (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,则默认使用 0lead(sum_price, 1, 0.00) over (partition by sku_id order by create_date_for) as sum_price_lastfrom (-- 1) 统计 1号 2号 商品每个月的销售总额select sku_id,date_format(create_date, 'yyyy-MM') create_date_for,sum(price)                          sum_pricefrom order_detailwhere sku_id in (1, 2)--  这里 date_format(create_date, 'yyyy-MM') 被视为一个整体group by sku_id, date_format(create_date, 'yyyy-MM')) t1) t2where 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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部