表格(DB-Fiddle)
CREATE TABLE sales (
id int auto_increment primary key,
product VARCHAR(255),
sales_date DATE,
insert_time DATE
);
INSERT INTO sales
(product, sales_date, insert_time
)
VALUES
("Product A", "2020-04-15", "2020-03-05"),
("Product B", "2020-05-20", "2020-03-05"),
("Product C", "2020-02-11", "2020-03-05"),
("Product A", "2020-04-15", "2020-03-06"),
("Product B", "2020-05-20", "2020-03-06"),
("Product C", "2020-02-11", "2020-03-06"),
("Product A", "2020-04-15", "2020-03-07"),
("Product B", "2020-05-20", "2020-03-07"),
("Product C", "2020-02-11", "2020-03-07");
在每天的上表中,插入产品销售并分配给insert_time
。
现在,我想按insert_time
检查此查询结果中的产品:
SELECT
product,
sales_date
FROM sales
WHERE insert_time = "2020-03-05";
也会出现在此查询的结果中:
SELECT
product,
sales_date
FROM sales
WHERE insert_time = "2020-03-05"
AND sales_date BETWEEN insert_time AND DATE_ADD(insert_time, INTERVAL 3 MONTH)
最终结果应如下所示:
product sales_date Check
Product A 2020-04-15 O.K.
Product B 2020-05-20 O.K.
Product C 2020-02-11 Error (--> Because it only appears in the first query)
我如何合并两个查询才能获得预期的结果?
答案 0 :(得分:1)
您可以使用CASE语句解决此问题:
SELECT
product,
sales_date,
CASE
WHEN sales_date BETWEEN insert_time AND DATE_ADD(insert_time, INTERVAL 3 MONTH) THEN 'Ok'
ELSE 'Error' END AS 'Check'
FROM sales
WHERE insert_time = "2020-03-05";
您也可以使用LEFT JOIN,但这意味着您必须两次打桌:
SELECT all_records.product, all_records.sales_date, ifnull(filtered_records.Check, 'Error') AS `Check`
FROM
(
SELECT
product,
sales_date,
'Ok' AS 'Check'
FROM sales
WHERE insert_time = "2020-03-05"
) all_records
LEFT JOIN
(
SELECT
product,
sales_date,
'OK' AS 'Check'
FROM sales
WHERE insert_time = "2020-03-05"
AND sales_date BETWEEN insert_time AND DATE_ADD(insert_time, INTERVAL 3 MONTH)
) filtered_records
ON all_records.product = filtered_records.product
AND all_records.sales_date = filtered_records.sales_date
答案 1 :(得分:0)
想到一个带有CASE
的{{1}}表达式:
EXISTS
请注意,SELECT s.product, s.sales_date,
(CASE WHEN EXISTS (SELECT 1
FROM sales s2
WHERE s2.product = s.product AND
s2.sales_date BETWEEN s2.insert_time AND DATE_ADD(s2.insert_time, INTERVAL 3 MONTH)
)
THEN 'OK' ELSE 'ERROR'
END) as flag
FROM sales s
WHERE s.insert_time = '2020-03-05';
对于列是一个坏名称,因为它是一个SQL关键字(用于check
约束)。