MS Access查找具有上一年订单并且没有今年订单的客户

时间:2016-02-25 11:52:15

标签: database ms-access

这个问题需要很长时间才能解决,所以我希望有人可以帮助我。

我有一个简单的MS Access数据库:两个表(客户和订单),我需要获得那些去年订购并且今年没有订购的客户。 该数据库用于向客户发送包含信息的CD。他们每年订阅一次,然后每月收到一张CD。我想要的是找到那些今年忘记订阅的人。

表"客户"非常简单:有"客户名称","地址","电子邮件"等字段。等等。它与表" Orders"相关联,其中存储了每个客户的所有订单。它也非常基本,有以下字段:"订单状态","订单类型","订单年份" (此处,已存储订单的年份),"数量"和评论。

我试图创建2个查询,每个查询会收集此次和前一年的订单(通过使用" Order year"字段),但我无法弄清楚接下来要做什么,如何撤出2015年订购的客户在2016年没有订单?

3 个答案:

答案 0 :(得分:0)

这样的事情应该有效:

SELECT C.* FROM Customers C
  INNER JOIN Orders O ON C.Id = O.CustomerID AND O.OrderYear = 2015
  LEFT JOIN Orders O2 ON C.Id = O2.CustomerID AND O.OrderYear = 2016
WHERE O2.Id IS NULL

它将从2015年开始获得订单记录的客户,然后它将在2016年的订单上设置外部联接,如果没有匹配,将为2016订单字段返回NULL。然后,WHERE子句将过滤掉具有匹配的2016年订单的所有内容。

答案 1 :(得分:0)

如果你在Access中这样做,我会分阶段进行: -

(1)设置一个查询(Query1)将客户加入Orders并选择keyID where subscriptYear = 2015。可能想要设置唯一值或使用GROUP BY来避免重复。

(2)为subscriptYear = 2016设置类似的查询(Query2)。

(3)设置第三个查询,其中Query1左侧连接到keyID上的查询2,并指定Query2.keyID = NULL

答案 2 :(得分:0)

     SELECT a.*,b.orderyear
     FROM (select t1.* from customers t1 inner join orders o on t1.ID=o.CustomerID where o.orderyear=2015) a
     LEFT join (select * from orders where orderyear=2016) b 
     ON a.ID=b.CustomerID 
     WHERE b.orderyear is null

将2015年订购的客户拉出来,2016年没有订单