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. 按年度列出销售总额相关推荐

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

    文章目录 1. 题目 2. 解题 1. 题目 Product 表: +---------------+---------+ | Column Name | Type | +-------------- ...

  2. LeetCode MySQL解题目录

    已完成的 LeetCode MySQL 数据库题目.点击查看我的 LeetCode 算法解题目录. 已解决 123/123 - 简单 54 中等 51 困难 18 前置入门学习 MySQL 基本查询. ...

  3. 如何学好C语言--你的学渣朋友告诉你

    光说不练假把式,光练不说傻把式,又练又说真把式. 真实感受,不是我不想学,是我真的不知道我哪里不会啊和得怎么做啊?本文作者当初就是这么废掉的 推荐两个练习的网站 (一)C语言网 https://www ...

  4. LeetCode数据库题目1-123

    LeetCode数据库题目1-123 175. 组合两个表 难度简单 SQL架构 表1: Person +-------------+---------+ | 列名 | 类型 | +--------- ...

  5. LeetCode-数据库题(二) (52-125题 到1565)

    文章目录 [1075. 项目员工 I](https://leetcode-cn.com/problems/project-employees-i/) [1076. 项目员工II](https://le ...

  6. LeetCode刷SQL题

    https://leetcode-cn.com/problemset/database/ 题目都是leetcode 上了可以点击题目会有相应的链接 由于个人比较喜欢用开窗函数,所以都优先用了开窗 ,当 ...

  7. leetcode数据库题目1-123题(20-08-14)(1)

    难度简单 SQL架构 表1: Person +-------------+---------+ | 列名 | 类型 | +-------------+---------+ | PersonId | i ...

  8. LeetCode-SQL题目集

    目标 一.重点 二.简单 三.可略 一.重点 序号 题号 题目 题解链接 标签 备注 1 176 176. 第二高的薪水 [LeetCode-SQL]176. 第二高的薪水 重复值如何返回? 2 17 ...

  9. 【数据库系统】数据库系统学习与实践系列文章汇总目录(持续更新中)

    本文属于「数据库系统」系列文章的汇总目录,这一系列着重于「数据库系统知识的学习与实践」.由于文章内容随时可能发生更新变动,欢迎关注和收藏本文以作备忘.需要特别说明的是,为了透彻理解和全面掌握数据库系统 ...

  10. sql-年度销售总额,拓展出对照表,排序表 ,日期排序表,日历表

    –author:李银实 –按年度列出销售总额 –1)建表插入数据 并查询 Create table If Not Exists 83_Product (product_id int, product_ ...

最新文章

  1. 循环遍历和迭代器遍历如何选择
  2. dos删除文件与文件夹
  3. android文件存储数组,Android面试简录——文件存储
  4. camuda流程引擎如此简单(一)
  5. testng的报告自定义笔记
  6. Linux cpu亲和力
  7. 有限状态机FSM的写法
  8. Mac的shell命令大全
  9. Java递归算法求n的阶乘
  10. python采集直播间数据_利用Python爬虫爬取斗鱼直播间信息,以及直播的实际人数!...
  11. 浏览器无法访问百度的问题
  12. ios开发 之 简体和繁体中文转换
  13. 一张图架构示意图及简单分析
  14. 上层应用程序是如何访问到底层驱动程序的呢?
  15. A调用B方法,@Transactional事务问题
  16. Win10系统程序图标上的盾牌怎么去除?
  17. 数学在计算机图形学中的应用
  18. UE4 的 VR 视野破碎或右眼错误的解决方案 —— 从 Ocean Floor Environment 项目
  19. 程序员老鸟写sql语句的经验之谈
  20. 细胞重编程技术方法学评估

热门文章

  1. java DFS与BFS算法
  2. 和Keyle一起学ShaderForge – Create Base Shader
  3. 可口可乐中国联袂青年志发布《中国青年「在乎力」报告》
  4. MATLAB快捷键大全
  5. 【Dll调试】DLL调试方法
  6. 一个从培训机构出来的程序员
  7. 贝尔商道赚钱思维36道第09道:今之赚大钱者
  8. 面试宝典(二)之经典面试题(含详细答案)
  9. mysql 两阶段加锁_MySql-两阶段加锁协议
  10. 如何设置论文目录左对齐?