列表

详情


1384. 按年度列出销售总额

 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 列存储销售期内该产品的日平均销售额。
销售日期范围为2018年到2020年。

 

编写解决方案,找出每个产品每年的总销售额,并包含 product_id , product_namereport_year 以及 total_amount 。

返回结果并按 product_idreport_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。

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
# Write your MySQL query statement below

mysql 解法, 执行用时: 297 ms, 内存消耗: 0 B, 提交时间: 2023-10-15 22:58:03

# Write your MySQL query statement below
WITH temp1 AS (
SELECT 2018 AS year UNION
SELECT 2019 AS year UNION
SELECT 2020 AS year
),temp2 AS (
SELECT
    product_id,average_daily_sales,year,
    CASE WHEN YEAR(period_start) = year AND YEAR(period_end) = year THEN DAYOFYEAR(period_end) - DAYOFYEAR(period_start) + 1
         WHEN YEAR(period_start) < year AND YEAR(period_end) > year THEN IF(year = 2020,366,365)
         WHEN YEAR(period_start) = year THEN IF(year = 2020,367 - DAYOFYEAR(period_start),366 - DAYOFYEAR(period_start))
         WHEN YEAR(period_end) = year THEN DAYOFYEAR(period_end) END AS date
FROM
    Sales JOIN temp1
ON
    year BETWEEN YEAR(period_start) AND YEAR(period_end)
)

SELECT   #执行用时446ms,在所有MySQL提交中击败81.73%的用户
    product_id,product_name,CAST(year AS CHAR) AS report_year,date * average_daily_sales AS total_amount
FROM     #内存消耗0B,在所有MySQL提交中击败100.00%的用户
    temp2 LEFT JOIN Product
USING(product_id)
ORDER BY
    product_id,report_year  #2022.7.13

上一题