Formatted question description: https://leetcode.ca/all/1384.html

1384. Total Sales Amount by Year

Level

Hard

Description

Table: Product

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| product_id    | int     |
| product_name  | varchar |
+---------------+---------+
product_id is the primary key for this table.
product_name is the name of the product.

Table: Sales

+---------------------+---------+
| Column Name         | Type    |
+---------------------+---------+
| product_id          | int     |
| period_start        | varchar |
| period_end          | date    |
| average_daily_sales | int     |
+---------------------+---------+
product_id is the primary key for this table. 
period_start and period_end indicates the start and end date for sales period, both dates are inclusive.
The average_daily_sales column holds the average daily sales amount of the items for the period.

Write an SQL query to report the Total sales amount of each item for each year, with corresponding product name, product_id, product_name and report_year.

Dates of the sales years are between 2018 to 2020. Return the result table ordered by product_id and report_year.

The query result format is in the following example:

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 was sold for the period of 2019-01-25 to 2019-02-28, and there are 35 days for this period. Total amount 35*100 = 3500. 
LC T-shirt was sold for the period of 2018-12-01 to 2020-01-01, and there are 31, 365, 1 days for years 2018, 2019 and 2020 respectively.
LC Keychain was sold for the period of 2019-12-01 to 2020-01-31, and there are 31, 31 days for years 2019 and 2020 respectively.

Solution

For each product, for each year 2018, 2019 and 2020, calculate the days in the period and calculate the total amount in the year. In the final result, only the entries with total amount greater than 0 are displayed.

# Write your MySQL query statement below
select Sales.product_id, product_name, '2018' as report_year, if(period_start < '2019-01-01', (datediff(if(period_end < '2019-01-01', period_end, date('2018-12-31')), if(period_start >= '2018-01-01', period_start, date('2018-01-01'))) + 1) * average_daily_sales, 0) as total_amount
    from Sales join Product on Sales.product_id = Product.product_id having total_amount > 0
union
select Sales.product_id, product_name, '2019' as report_year, if(period_start < '2020-01-01', (datediff(if(period_end < '2020-01-01', period_end, date('2019-12-31')), if(period_start >= '2019-01-01', period_start, date('2019-01-01'))) + 1) * average_daily_sales, 0) as total_amount
    from Sales join Product on Sales.product_id = Product.product_id having total_amount > 0
union
select Sales.product_id, product_name, '2020' as report_year, if(period_start < '2021-01-01', (datediff(if(period_end < '2021-01-01', period_end, date('2020-12-31')), if(period_start >= '2020-01-01', period_start, date('2020-01-01'))) + 1) * average_daily_sales, 0) as total_amount
    from Sales join Product on Sales.product_id = Product.product_id having total_amount > 0
    order by product_id, report_year;

All Problems

All Solutions