LeetCode #销售分析III

102 阅读2分钟

一、题目

TableProduct

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| product_id   | int     |
| product_name | varchar |
| unit_price   | int     |
+--------------+---------+
  • Product_id是该表的主键。
  • 该表的每一行显示每个产品的名称和价格。
TableSales

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| seller_id   | int     |
| product_id  | int     |
| buyer_id    | int     |
| sale_date   | date    |
| quantity    | int     |
| price       | int     |
+------ ------+---------+
  • 这个表没有主键,它可以有重复的行。
  • product_id 是 Product 表的外键。
  • 该表的每一行包含关于一个销售的一些信息。  

编写一个SQL查询,报告2019年春季才售出的产品。即仅在2019-01-01至2019-03-31(含)之间出售的商品。

以 任意顺序 返回结果表。

查询结果格式如下所示。

 

示例 1:

输入:

Product table:
+------------+--------------+------------+
| product_id | product_name | unit_price |
+------------+--------------+------------+
| 1          | S8           | 1000       |
| 2          | G4           | 800        |
| 3          | iPhone       | 1400       |
+------------+--------------+------------+
Sales table:
+-----------+------------+----------+------------+----------+-------+
| seller_id | product_id | buyer_id | sale_date  | quantity | price |
+-----------+------------+----------+------------+----------+-------+
| 1         | 1          | 1        | 2019-01-21 | 2        | 2000  |
| 1         | 2          | 2        | 2019-02-17 | 1        | 800   |
| 2         | 2          | 3        | 2019-06-02 | 1        | 800   |
| 3         | 3          | 4        | 2019-05-13 | 2        | 2800  |
+-----------+------------+----------+------------+----------+-------+
输出:
+-------------+--------------+
| product_id  | product_name |
+-------------+--------------+
| 1           | S8           |
+-------------+--------------+

解释:

  • id为1的产品仅在2019年春季销售。
  • id为2的产品在2019年春季销售,但也在2019年春季之后销售。
  • id 3的产品在2019年春季之后销售。
  • 我们只退回产品1,因为它是2019年春季才销售的产品。

二、解题思路

创建数据表

根据题意创建数据表并填充数据

CREATE TABLE IF NOT EXISTS Product (
	product_id INT, 
	product_name VARCHAR(10), 
	unit_price INT
);
CREATE TABLE IF NOT EXISTS Sales (
	seller_id INT, 
	product_id INT, 
	buyer_id INT, 
	sale_date DATE,
	quantity INT, 
	price INT
 );


INSERT INTO Product VALUES
(1, 'S8', 1000),
(2, 'G4', 800),
(3, 'iPhone', 1400);

INSERT INTO Sales VALUES
(1, 1, 1, '2019-01-21', 2, 2000),
(1, 2, 2, '2019-02-17', 1, 800),
(2, 2, 3, '2019-06-02', 1, 800),
(3, 3, 4, '2019-05-13', 2, 2800);

解题

  • 根据题意,本题是要查询只在春节卖销售的商品
  • 有多种解题思路,可以使用排除法,排除在春季以外的商品,得到的商品就是只在春季销售的商品,但是觉得这种可能要查询的数据会更多一些,这里使用子查询,在商品表中分组查询,分组为商品id,查询的条件是卖出时间最大不能超过2019-03-31,最小不能小于2019-01-01。当前查询的结果集作为Product表的查询条件
  • 最后执行结果得到答案
SELECT
    product_id,
    product_name
FROM Product
WHERE product_id IN (
    SELECT
        product_id
    FROM Sales
    GROUP BY product_id
    HAVING MAX(sale_date) <= '2019-03-31'
    AND MIN(sale_date) >= '2019-01-01'
);
  • 显示结果 image.png

三、执行语句

测试结果

image.png

四、总结

本题首先要注意,要求的是只要春季出售过的商品,这个容易看错,第二个判断时间,这里判断时间用了min和max来计算最大小时间。