2016-12-02 69 views
0

我有2个表的一个客户,一个与订单MySQL查询客户选择在每年没有订单

SELECT customers.customer_name, orders.order_date 
FROM customers 
Left 
Join orders on (customers.customer_id = orders.customer_id) 
WHERE not orders.customer_id IN (SELECT customer_id from orders where Year(order_date) = Year(@Parameter1)) 
and not orders.order_date is null 

这个工作,但我希望每一年这样做是为了得到这样的财产以后的结果

|Year | customer_id | 
|2010 | 1   | 
|2010 | 2   | 
|2011 | 2   | 
|2011 | 3   | 
|2012 | 1   | 
+0

我认为你可以做到这一点 '选择年份(orders.order_date),客户。 CUSTOMER_ID 客户 左 加入上(customers.customer_id = orders.customer_id) 订单WHERE NOT IN orders.customer_id(选择订单CUSTOMER_ID其中year(order_date的)=年(@参数1)) 而不是orders.order_date是空' 测试它并让我知道。 – Ravenix

+2

@Ravenix我认为你可以将它作为答案而不是评论。 – Hermanto

回答

0

你要显示的客户和年份是出现在订单表列表。因此,让所有的客户提供所有年份相结合的列表,然后减去您在订单表中找到客户和期限:

select o.yr, c.customer_id 
from customers c 
cross join (select distinct year(order_date) as yr from orders) o 
where (c.customer_id, o.yr) not in (select customer_id, year(order_date) from orders); 
+0

感谢您的帮助,这工作。 –

0

天蝎座是有点权,你必须使用一年函数:

SELECT Year(orders.order_date), customers.customer_id 
FROM customers 
LEFT JOIN orders 
ON (customers.customer_id = orders.customer_id) 
WHERE NOT orders.customer_id 
IN (
    SELECT customer_id 
    FROM orders 
    WHERE Year(order_date) = Year(@Parameter1) 
) 
AND 
NOT orders.order_date is NULL 

您可以使用日Ë一年方法在查询中的SELECT部分​​

更新:

要显示所有谁没有在一年内订购的客户,你不需要加入。你可以用一个子查询做到这一点:

SELECT @Parameter1 AS Year, customer_id 
FROM customers 
WHERE customers.customer_id NOT IN (
    SELECT customer_id 
    FROM orders 
    WHERE Year(order_date) = Year(@Parameter1) 
) 
+0

这给了我那些年来订购的所有客户,我想那些年没有订购的客户。 –

+0

对不起,您的问题并不清楚。 – Ravenix