• 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:

    1. 输入:
    2. 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。
    1. with recursive sales_period AS ( # 递归体声明
    2. select
    3. product_id,
    4. period_start AS d1,
    5. if (str_to_date(concat(year(period_start),'-12-31'), '%Y-%m-%d') < period_end,
    6. str_to_date(concat(year(period_start),'-12-31'), '%Y-%m-%d'), period_end) AS d2
    7. from Sales
    8. UNION ALL
    9. select
    10. t.product_id,
    11. DATE_ADD(t.d2, INTERVAL 1 DAY)AS d1,
    12. if (DATE_ADD(t.d2, INTERVAL 1 YEAR) < period_end,
    13. DATE_ADD(t.d2, INTERVAL 1 YEAR), period_end) AS d2
    14. from sales_period AS t
    15. JOIN Sales USING(product_id)
    16. where d2 < Sales.period_end
    17. )
    18. select
    19. CAST(p.product_id AS CHAR) AS product_id,
    20. p.product_name AS product_name,
    21. CAST(year(sp.d1) AS CHAR) AS report_year,
    22. s.average_daily_sales * (datediff(sp.d2, sp.d1) + 1) AS total_amount
    23. from sales_period AS sp
    24. JOIN Product AS p USING(product_id)
    25. JOIN Sales AS s USING(product_id)
    26. where year(sp.d1) BETWEEN 2018 and 2020
    27. # 题目要求按序返回
    28. order by product_id, report_year
    1. with recursive t(n) as (
    2. select 0
    3. union all
    4. select n+1 from t where n<(select max(datediff(period_end, period_start)) from Sales)
    5. )
    6. select
    7. s.product_id,
    8. p.product_name,
    9. DATE_FORMAT(DATE_ADD(s.period_start, INTERVAL t.n DAY), '%Y') as report_year,
    10. sum(s.average_daily_sales) as total_amount
    11. from Sales s
    12. join t on datediff(s.period_end, s.period_start)>=t.n
    13. join Product p on s.product_id=p.product_id
    14. group by 1, 2, 3
    15. order by 1, 3

  • 相关阅读:
    组件之间通过bus中央事件总线进行通信
    如何判断oracle是否启动及启动oracle数据库
    【FreeRTOS(三)】任务状态
    JMU软件20Linux考试复习
    FPGA工程师面试试题集锦111~120
    Java从零学起(九)----集合
    BFS:FloodFill算法
    Python数据采集:抓取和解析XML数据
    c# wpf template ItemTemplate 简单试验
    羊了个羊的接口测试
  • 原文地址:https://blog.csdn.net/m0_69157845/article/details/125477875