1384. 按年度列出销售总额
SQL架构
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-25 至 2019-02-28 期间销售,该产品销售时间总计35天。销售总额 35*100 = 3500。 LC T-shirt 在 2018-12-01 至 2020-01-01 期间销售,该产品在2018年、2019年、2020年的销售时间分别是31天、365天、1天,2018年、2019年、2020年的销售总额分别是31*10=310、365*10=3650、1*10=10。 LC Keychain 在 2019-12-01 至 2020-01-31 期间销售,该产品在2019年、2020年的销售时间分别是:31天、31天,2019年、2020年的销售总额分别是31*1=31、31*1=31。
with recursive sales_period AS ( # 递归体声明selectproduct_id,period_start AS d1, if (str_to_date(concat(year(period_start),'-12-31'), '%Y-%m-%d') < period_end,str_to_date(concat(year(period_start),'-12-31'), '%Y-%m-%d'), period_end) AS d2from SalesUNION ALLselectt.product_id,DATE_ADD(t.d2, INTERVAL 1 DAY)AS d1,if (DATE_ADD(t.d2, INTERVAL 1 YEAR) < period_end,DATE_ADD(t.d2, INTERVAL 1 YEAR), period_end) AS d2from sales_period AS tJOIN Sales USING(product_id)where d2 < Sales.period_end
)selectCAST(p.product_id AS CHAR) AS product_id,p.product_name AS product_name,CAST(year(sp.d1) AS CHAR) AS report_year,s.average_daily_sales * (datediff(sp.d2, sp.d1) + 1) AS total_amount
from sales_period AS sp
JOIN Product AS p USING(product_id)
JOIN Sales AS s USING(product_id)
where year(sp.d1) BETWEEN 2018 and 2020# 题目要求按序返回
order by product_id, report_year
with recursive t(n) as (select 0union allselect n+1 from t where n<(select max(datediff(period_end, period_start)) from Sales)
)
selects.product_id,p.product_name,DATE_FORMAT(DATE_ADD(s.period_start, INTERVAL t.n DAY), '%Y') as report_year,sum(s.average_daily_sales) as total_amount
from Sales sjoin t on datediff(s.period_end, s.period_start)>=t.njoin Product p on s.product_id=p.product_id
group by 1, 2, 3
order by 1, 3
1384. 按年度列出销售总额相关推荐
- LeetCode MySQL 1384. 按年度列出销售总额
文章目录 1. 题目 2. 解题 1. 题目 Product 表: +---------------+---------+ | Column Name | Type | +-------------- ...
- LeetCode MySQL解题目录
已完成的 LeetCode MySQL 数据库题目.点击查看我的 LeetCode 算法解题目录. 已解决 123/123 - 简单 54 中等 51 困难 18 前置入门学习 MySQL 基本查询. ...
- 如何学好C语言--你的学渣朋友告诉你
光说不练假把式,光练不说傻把式,又练又说真把式. 真实感受,不是我不想学,是我真的不知道我哪里不会啊和得怎么做啊?本文作者当初就是这么废掉的 推荐两个练习的网站 (一)C语言网 https://www ...
- LeetCode数据库题目1-123
LeetCode数据库题目1-123 175. 组合两个表 难度简单 SQL架构 表1: Person +-------------+---------+ | 列名 | 类型 | +--------- ...
- LeetCode-数据库题(二) (52-125题 到1565)
文章目录 [1075. 项目员工 I](https://leetcode-cn.com/problems/project-employees-i/) [1076. 项目员工II](https://le ...
- LeetCode刷SQL题
https://leetcode-cn.com/problemset/database/ 题目都是leetcode 上了可以点击题目会有相应的链接 由于个人比较喜欢用开窗函数,所以都优先用了开窗 ,当 ...
- leetcode数据库题目1-123题(20-08-14)(1)
难度简单 SQL架构 表1: Person +-------------+---------+ | 列名 | 类型 | +-------------+---------+ | PersonId | i ...
- LeetCode-SQL题目集
目标 一.重点 二.简单 三.可略 一.重点 序号 题号 题目 题解链接 标签 备注 1 176 176. 第二高的薪水 [LeetCode-SQL]176. 第二高的薪水 重复值如何返回? 2 17 ...
- 【数据库系统】数据库系统学习与实践系列文章汇总目录(持续更新中)
本文属于「数据库系统」系列文章的汇总目录,这一系列着重于「数据库系统知识的学习与实践」.由于文章内容随时可能发生更新变动,欢迎关注和收藏本文以作备忘.需要特别说明的是,为了透彻理解和全面掌握数据库系统 ...
- sql-年度销售总额,拓展出对照表,排序表 ,日期排序表,日历表
–author:李银实 –按年度列出销售总额 –1)建表插入数据 并查询 Create table If Not Exists 83_Product (product_id int, product_ ...
最新文章
- 循环遍历和迭代器遍历如何选择
- dos删除文件与文件夹
- android文件存储数组,Android面试简录——文件存储
- camuda流程引擎如此简单(一)
- testng的报告自定义笔记
- Linux cpu亲和力
- 有限状态机FSM的写法
- Mac的shell命令大全
- Java递归算法求n的阶乘
- python采集直播间数据_利用Python爬虫爬取斗鱼直播间信息,以及直播的实际人数!...
- 浏览器无法访问百度的问题
- ios开发 之 简体和繁体中文转换
- 一张图架构示意图及简单分析
- 上层应用程序是如何访问到底层驱动程序的呢?
- A调用B方法,@Transactional事务问题
- Win10系统程序图标上的盾牌怎么去除?
- 数学在计算机图形学中的应用
- UE4 的 VR 视野破碎或右眼错误的解决方案 —— 从 Ocean Floor Environment 项目
- 程序员老鸟写sql语句的经验之谈
- 细胞重编程技术方法学评估