【LC困难】1384. 按年度列出销售总额

news/2025/1/13 9:26:16/

❤️博客主页: 楚生辉
❤️系列专栏:【LeetCode刷题】
❤️一句短话: 坚持不懈,孜孜不倦

1.题目描述

Product 表:

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| product_id    | int     |
| product_name  | varchar |
+---------------+---------+
product_id 是这张表的主键。
product_name 是产品的名称。

Sales 表:

+---------------------+---------+
| Column Name         | Type    |
+---------------------+---------+
| product_id          | int     |
| period_start        | date    |
| period_end          | date    |
| average_daily_sales | int     |
+---------------------+---------+
product_id 是这张表的主键。
period_start 和 period_end 是该产品销售期的起始日期和结束日期,且这两个日期包含在销售期内。
average_daily_sales 列存储销售期内该产品的日平均销售额。

编写一段 SQL 查询每个产品每年的总销售额,并包含 product_id, product_name 以及 report_year 等信息。

销售年份的日期介于 2018 年到 2020 年之间。你返回的结果需要按 product_id 和 report_year 排序。

查询结果格式如下例所示。

示例 1:

输入:
Product table:
+------------+--------------+
| product_id | product_name |
+------------+--------------+
| 1          | LC Phone     |
| 2          | LC T-Shirt   |
| 3          | LC Keychain  |
+------------+--------------+
Sales table:
+------------+--------------+-------------+---------------------+
| product_id | period_start | period_end  | average_daily_sales |
+------------+--------------+-------------+---------------------+
| 1          | 2019-01-25   | 2019-02-28  | 100                 |
| 2          | 2018-12-01   | 2020-01-01  | 10                  |
| 3          | 2019-12-01   | 2020-01-31  | 1                   |
+------------+--------------+-------------+---------------------+
输出:
+------------+--------------+-------------+--------------+
| product_id | product_name | report_year | total_amount |
+------------+--------------+-------------+--------------+
| 1          | LC Phone     |    2019     | 3500         |
| 2          | LC T-Shirt   |    2018     | 310          |
| 2          | LC T-Shirt   |    2019     | 3650         |
| 2          | LC T-Shirt   |    2020     | 10           |
| 3          | LC Keychain  |    2019     | 31           |
| 3          | LC Keychain  |    2020     | 31           |
+------------+--------------+-------------+--------------+
解释:
LC Phone 在 2019-01-252019-02-28 期间销售,该产品销售时间总计35天。销售总额 35*100 = 3500。LC T-shirt 在 2018-12-012020-01-01 期间销售,该产品在2018年、2019年、2020年的销售时间分别是31天、365天、1天,2018年、2019年、2020年的销售总额分别是31*10=310365*10=36501*10=10。LC Keychain 在 2019-12-012020-01-31 期间销售,该产品在2019年、2020年的销售时间分别是:31天、31天,2019年、2020年的销售总额分别是31*1=3131*1=31

2.代码实现

select t.product_id,product_name,report_year,sum(total_amount)total_amount from (select product_id,"2020" report_year,(datediff(if (period_end<"2021-01-01",period_end,date("2020-12-31")),if(period_start>"2020-01-01",period_start,date("2020-01-01")))+1)*average_daily_sales total_amount from Sales having total_amount>0 
union all
select product_id,"2019" report_year,(datediff(if(period_end<"2020-01-01",period_end,date("2019-12-31")),if(period_start>"2019-01-01",period_start,date("2019-01-01")))+1)*average_daily_sales total_amount from Sales having total_amount>0 
union all
select product_id,"2018" report_year,(datediff(if(period_end<"2019-01-01",period_end,date("2018-12-31")),if(period_start>"2018-01-01",period_start,date("2018-01-01")))+1)*average_daily_sales total_amount from Sales having total_amount>0  )t left join product p on p.product_id=t.product_id                               
group by product_id,report_year order by product_id,report_year

**思路:**根据年份分别计算出这三年的销售总额,因为题目把时间限定在2018到2020之间

仔细分析,我们可以发现所有的年份无非就是四种情况,我们拿2020年进行举例

  1. 2020 - 2020
  2. 2020 - 2021
  3. 2019 - 2020
  4. 2019 - 2021

情况一:两者都是2020,直接datediff日期相减即可

情况二:如果period_end > 2020-12-31(或者写成period_end < 2021-01-01),那么用 2020-12-31将其替代,进行与period_start相减

情况三:如果period_start < 2020-01-01,那么替换成 2020-01-01,然后再参与datediff计算

情况四:前面三个完成,那么情况四不用考虑,自动满足


http://www.ppmy.cn/news/590623.html

相关文章

拼多多618手机品牌官旗销量同比增长124%,4000+高价位手机同比增长156%

6月19日&#xff0c;拼多多发布了618手机“真香”战报。截至18日23:59的数据显示&#xff0c;在全网最高性价比的优势下&#xff0c;平台手机类目在618期间继续保持了强劲势头&#xff0c;全类目销售额同比增长148%&#xff0c;订单量同比增长118%。 ▲在618期间&#xff0c;拼…

iPhone12销量惊人,两个月就冲到5G手机市场前二

市调机构Strategy Analytics(SA)给出的数据指2020年全球5G手机市场前三名分别为华为、苹果、三星&#xff0c;其中苹果是从去年10月中旬开始销售第一款5G手机iPhone12的&#xff0c;仅仅两个月就超越了众多安卓手机企业&#xff0c;可见iPhone销量非常惊人。 iPhone12表现如此惊…

苹果折叠手机新专利曝光,折叠屏手机1月销量同比翻了近20倍

最近&#xff0c;关于“苹果公司可折叠手机新专利”的事情登上热搜。根据美国商标和专利局的消息&#xff0c;苹果公司获得了一项专利&#xff0c;在检测到配备柔性屏幕的 iPhone / iPad 处于掉落状态中&#xff0c;屏幕将会自动折叠从而最大限度地减少屏幕受损的情况。 从某种…

国产手机很无奈,消费者等待iPhone12,国内5G手机销量大跌

中国信通院公布的数据显示7月份中国市场的手机出货量同比暴跌超过三成&#xff0c;其中此前销量节节升高的5G手机出货量也出现环比大跌&#xff0c;似乎消费者在等待苹果即将发布的iPhone12&#xff0c;不愿购买国产5G手机。 信通院公布的数据显示7月份中国市场的5G手机出货量为…

面试复习 设计模式

1 单例模式 单例模式是一种常用的软件设计模式&#xff0c;它确保一个类仅有一个实例&#xff0c;并提供全局访问点。在C中&#xff0c;我们可以使用静态成员变量和私有构造函数来实现。 下面是C的懒汉式和饿汉式单例模式的例子&#xff1a; 1.1 饿汉式&#xff08;Eager In…

Jmeter性能测试

一、jmeter多并发 1.线程设置&#xff1a; 线程数——多少个虚拟用户 ramp_up时间(秒)——时间&#xff0c;设置时间内将线程都跑完 循环次数——勾选永远&#xff0c;就一直跑&#xff0c;直到手动停止&#xff1b;输入数字&#xff0c;就是循环多少次 2.jmeter逻辑分支控制…

Spring Cloud 疑难杂症之 CompletableFuture 与 Openfeign 一起使用的问题

CompletableFuture 与 Openfeign 一起使用的问题 问题描述问题解决 问题描述 直接错误信息 Could not find class [org.springframework.boot.autoconfigure.condition.OnPropertyCondition] java.util.concurrent.CompletionException: org.springframework.beans.factory.B…

SSMP整合案例(7) MybatisPlus快速service业务层开发

上文 SSMP整合案例(6) 业务service层逻辑编写我们创建并编写了service业务层代码 但是 这样一个一个去写 确实是有点麻烦 重复性工作 但其实这个已经有人帮我们考虑好了 MP就帮我们做了一个 service快捷开发的方式 我们在项目中的service包下创建一个接口 叫 IBookService 其实…