SQL:当年未购买商品的客户

时间:2019-03-17 01:13:29

标签: mysql sql

我有以下两种模式:Schemas

我想查找当年未购买商品的客户列表。

我被困在“当年”部分。

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

谢谢。

2 个答案:

答案 0 :(得分:1)

要过滤日期,一种有效的方法是将其与代表当前年份开始的固定值进行比较,例如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')
)

这里是另一个使用`LEFTJOINè的选项:

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

答案 1 :(得分:0)

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为null,则仅返回一行。