比较两个查询结果并检查两个值是否都存在

时间:2020-04-05 10:26:09

标签: mysql sql

表格(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)

我如何合并两个查询才能获得预期的结果?

2 个答案:

答案 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约束)。

相关问题