Сравните результаты двух запросов и проверьте, существуют ли значения в обоих - PullRequest
1 голос
/ 05 апреля 2020

Таблица ( 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 ]

1 голос
/ 05 апреля 2020

Вы можете решить эту проблему с помощью оператора 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
0 голосов
/ 05 апреля 2020
На ум приходит

A CASE выражение с 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';

Обратите внимание, что check - это неправильное имя для столбца, потому что это ключевое слово SQL (используется для check ограничения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...