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

文章目录

    • 1. 题目
    • 2. 解题

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 Saleshaving total_amount > 0union allselect 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_amountfrom Saleshaving total_amount > 0union allselect 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_amountfrom Saleshaving 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阿明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux历史性能数据,Linux平台下如何看OS历史的性能数据

同事电话询问Linux下一个集群内2个主机前后2天相继无响应&#xff0c;表现状况为ping都没响应。因为没任何监控或其他性能数据&#xff0c;故需要获取历史OS性能数据。我们知道rhel5,6下默认可以通过sar命令查看OS历史信息&#xff0c;故执行sar即可看到当天的数据。[rootora11…

python输入以及比较逻辑运算符介绍(含笔记)

1. 输入 咱们在银行ATM机器前取钱时&#xff0c;肯定需要输入密码&#xff0c;对不&#xff1f;那么怎样才能让程序知道咱们刚刚输入的是什么呢&#xff1f;&#xff1f;大家应该知道了&#xff0c;如果要完成ATM机取钱这件事情&#xff0c;需要先从键盘中输入一个数据&#xf…

C语言 二维数组做函数参数的几种情况

&#xff08;1&#xff09; 实参为数组元素地址&#xff0c;虚参为元素类型指针 &#xff08;a&#xff09; 调用函数&#xff1a;fun(*a,3*4); //*a也可为a[0] or &a[0][0] 函数&#xff1a; fun(int *p,int n) //*p也可为p[]{ p[i] or *(pi) } &#xff…

LeetCode MySQL 1336. 每次访问的交易次数

文章目录1. 题目2. 解题1. 题目 表: Visits ------------------------ | Column Name | Type | ------------------------ | user_id | int | | visit_date | date | ------------------------ (user_id, visit_date) 是该表的主键 该表的每行表示 user…

python中if命令简单介绍及注意事项(含笔记)

if语句是用来进行判断的&#xff0c;其使用格式如下&#xff1a;

putty连接linux上传python,通过PuTTY用于SSH的Python脚本

我可以在命令行中给出以下命令C:\>cd "C:\Program Files\ExtraPuTTY\Bin"C:\Program Files\ExtraPuTTY\Bin>putty.exe -ssh root172.20.0.102 22这可以帮助我通过PuTTY打开SSH会话.而我无法在Python脚本中复制它们.cwd"C://Program Files//ExtraPuTTY//Bi…

jQuery源码分析系列:事件模块概述

jQuery的事件模块是较复杂的&#xff0c;前面仅仅提到了对事件对象的包装。即统一了一些兼容性的问题。这篇会综述下jQuery的整个事件模块。后面会详细分析jQuery.event.add/jQuery.event.remove/jQuery.event.trigger。 虽然事件模块代码很难读&#xff0c;但其提供的API接口还…

LeetCode MySQL 1159. 市场分析 II(rank+over)

文章目录1. 题目2. 解题1. 题目 表: Users ------------------------- | Column Name | Type | ------------------------- | user_id | int | | join_date | date | | favorite_brand | varchar | ------------------------- user_id 是该表的主键…

linux基础 linhaifeng,Linux 基础命令(一)

Linux 基础&#xff1a;Linux 比 Windows 更稳定做服务器&#xff0c;开发出来的软件需要在服务器上运行# 测试硬盘速度dd if/dev/zero ofsdb5/test bs10G count1# 写一个 10G 的文件写文件 input fileout file block size1. 操作系统内核与系统调用1.1 操作系统操作系统是用来…

python中elif和while简单介绍及注意事项(含笔记)

一、elif 想一想&#xff1a; if能完成当xxx时做事情&#xff1b;if-else能完成当xxx时做事情1&#xff0c;否则做事情2; 如果有这样一种情况&#xff1a;当xxx1时做事情1&#xff0c;当xxx2时做事情2&#xff0c;当xxx3时做事情3&#xff0c;那该怎么实现呢&#xff1f; 答…

oracle 从别的数据库获取数据 ,访问其他数据库

在某个oracle数据库&#xff0c;获取其他oracle数据库中的数据&#xff0c;需要建立database link&#xff0c;在使用语句获取数据 假设前置机实例名prod,你要查询的用户scott密码tiger在本机:create database link xxx connect to scott identified by tiger usingprod;成功连…

linux怎么安装32电脑上,linux – 如何在Ubuntu上安装mingw32?

仔细查看实际可用的内容&#xff1a;eddmax:~$apt-cache search mingw-libassuan-mingw-w64-dev - IPC library for the GnuPG components -- Windows portlibgcrypt-mingw-w64-dev - LGPL Crypto library - Windows developmentlibgpg-error-mingw-w64-dev - library of error…

LeetCode MySQL 262. 行程和用户

文章目录1. 题目2. 解题1. 题目 Trips 表中存所有出租车的行程信息。 每段行程有唯一键 Id&#xff0c;Client_Id 和 Driver_Id 是 Users 表中 Users_Id 的外键。 Status 是枚举类型&#xff0c;枚举成员为 (‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’…

花了一年时间开发出来的基于DXF文件的加工路径自动生成软件

随着科技水平的进步&#xff0c;计算机辅助制造技术CAD/CAM在机械加工中起着越来越重要得作用,传统的手动编程正在被自动编程所取代&#xff0c;目前PRO/E,UG,MasterCAM等商业软件可以根据设计的图形直接生成数控加工代码。然而这些软件相对来说功能复杂&#xff0c;不易掌握&a…

LeetCode 1136. 平行课程(拓扑排序)

文章目录1. 题目2. 解题1. 题目 已知有 N 门课程&#xff0c;它们以 1 到 N 进行编号。 给你一份课程关系表 relations[i] [X, Y]&#xff0c;用以表示课程 X 和课程 Y 之间的先修关系&#xff1a;课程 X 必须在课程 Y 之前修完。 假设在一个学期里&#xff0c;你可以学习任…

linux强制停止压缩任务,6.25任务(linux压缩、打包命令:zip、tar)

6.5 zip压缩工具前面的三个命令都不支持压缩目录&#xff0c;但是zip支持&#xff1a;首先压缩文件[rootlocalhost gzip]# yum -y install zip[rootlocalhost gzip]# zip b.txt.zip b.txtadding: b.txt (deflated 74%)[rootlocalhost gzip]# ls //原文件依旧存在。不…

【Android】Uri和Url和URN

最早在Android方面接触这两个概念&#xff0c;是学习ContentProvider的时候&#xff0c;当时花了很多时间&#xff0c;始终不能很好的理解他们的区别&#xff0c;顺带着ContentProvider的用法也无法理解&#xff0c;最近通过实现网页链接和Android-APP的无缝跳转问题&#xff0…