SQL: клиенты, которые не сделали покупки в текущем году - PullRequest
0 голосов
/ 17 марта 2019

У меня есть две схемы: Schemas

Я хочу найти список клиентов, которые не совершили покупку в текущем году.

Iя застрял в части "в течение текущего года".

SELECT c.fname, c.lname
FROM customers c
WHERE c.cust_id NOT IN (SELECT s.Cust_id FROM sales s);

Спасибо.

Ответы [ 2 ]

1 голос
/ 17 марта 2019

Для фильтрации по дате эффективный вариант - сравнить ее с фиксированным значением, которое представляет начало текущего года, например DATE_FORMAT(NOW() ,'%Y-01-01').

Кроме того, вместо использования оператора IN я бы использовал условие NOT EXISTS с коррелированным подзапросом (хотя оба должны работать, это типичный вариант использования для NOT EXISTS, поскольку на самом деле вам не нужно получить доступ к чему-либо из подзапроса):

SELECT c.fname, c.lname
FROM customers c
WHERE NOT EXISTS (
    SELECT 1 
    FROM sales s 
    WHERE s.cust_id = c.cust_id AND s.date >= DATE_FORMAT(NOW() ,'%Y-01-01')
)

Вот еще одна опция, которая использует `LEFT JOINè:

SELECT c.fname, c.lname
FROM customers c
LEFT JOIN sales s 
    ON  s.cust_id = c.cust_id 
    AND s.date >= DATE_FORMAT(NOW() ,'%Y-01-01')
WHERE s.cust_id IS NULL
0 голосов
/ 17 марта 2019
SELECT c.fname, c.lname
FROM customers c
LEFT JOIN sales s ON c.cust_id = s.cust_id
    AND YEAR(s.Date) = YEAR(CURDATE())
WHERE s.Sales_id IS NOT NULL

Этот запрос возвращает клиентов, и левые присоединяются к продажам, что делает его необязательным для запроса в целом. Это присоединение к продаже для клиента и произошло в этом году. Затем в предложении where она возвращает строку, только если строка для продаж не возвращается, т. Е. Sales_id равен нулю.

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