一、题目
Table: Product
+--------------+---------+
| Column Name | Type |
+--------------+---------+
| product_id | int |
| product_name | varchar |
| unit_price | int |
+--------------+---------+
- Product_id是该表的主键。
- 该表的每一行显示每个产品的名称和价格。
Table: Sales
+-------------+---------+
| 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'
);
- 显示结果
三、执行语句
测试结果
四、总结
本题首先要注意,要求的是只要春季出售过的商品,这个容易看错,第二个判断时间,这里判断时间用了min和max来计算最大小时间。