这个问题需要很长时间才能解决,所以我希望有人可以帮助我。
我有一个简单的MS Access数据库:两个表(客户和订单),我需要获得那些去年订购并且今年没有订购的客户。 该数据库用于向客户发送包含信息的CD。他们每年订阅一次,然后每月收到一张CD。我想要的是找到那些今年忘记订阅的人。
表"客户"非常简单:有"客户名称","地址","电子邮件"等字段。等等。它与表" Orders"相关联,其中存储了每个客户的所有订单。它也非常基本,有以下字段:"订单状态","订单类型","订单年份" (此处,已存储订单的年份),"数量"和评论。
我试图创建2个查询,每个查询会收集此次和前一年的订单(通过使用" Order year"字段),但我无法弄清楚接下来要做什么,如何撤出2015年订购的客户在2016年没有订单?
答案 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年没有订单