LeetCode MySQL 1384. 按年度列出销售总额

文章目录

1. 题目

Product 表:

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

Sales 表:

+---------------------+---------+
| Column Name         | Type    |
+---------------------+---------+
| product_id          | int     |
| period_start        | varchar |
| 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 排序。

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

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                   |
+------------+--------------+-------------+---------------------+

Result table:
+------------+--------------+-------------+--------------+
| 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/total-sales-amount-by-year
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 使用 datediff 求出日期之间的差,嵌套使用 if 确定年的起始和结束
select product_id, "2020" report_year,
        (datediff(if(period_end <= "2020-12-31", 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 # 由于可能会有日期做差为负数
{"headers": ["product_id", "report_year", "total_amount"], 
"values": [
["2", "2020", 10], 
["3", "2020", 31]]}
  • 求出3个年份的 合并 union all,再分组,求和
# Write your MySQL query statement below
select product_id, product_name, report_year, sum(total_amount) total_amount
from
(
    select product_id, "2020" report_year,
            (datediff(if(period_end <= "2020-12-31", 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 <= "2019-12-31", 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 <= "2018-12-31", 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
using(product_id)
group by report_year, product_id
order by product_id, report_year

我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Michael阿明

如果可以,请点赞留言支持我哦!

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

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

打赏作者

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

抵扣说明:

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

余额充值