SQL JOIN无法按预期工作

时间:2016-05-20 15:23:51

标签: sql ms-access-2010

我有两个MS ACCESS表a和b就像这样

a:custId,custName b:日期,transId,custId,花费

我想知道每个客户在一段时间内(例如2016年1月)的花费,无论他们是否真的在那个月进行了交易。我正在使用的SQL查询是

SELECT a.custId, SUM(b.spend) FROM b
LEFT JOIN a ON b.custId = a.custId
WHERE b.date >= #01/01/2016# AND b.date <= #31/12/2016#
GROUP BY a.custId

我原本期望得到一张记录集,其中包含表a中的所有客户ID,其总支出(如果它们是活动的)或NULL(如果它们不是)。但是,ACCESS仅返回1月份其ID出现在表b中的客户的支出,而忽略其余的客户。我很确定我一定做错了查询,但不知道是什么。感谢所有建议。谢谢!

2 个答案:

答案 0 :(得分:2)

在MS Access中很难做到这一点。首先,请注意您似乎想要&#34; a&#34;表首先,而不是第二,所以你保留所有客户。

WHERELEFT JOIN变为INNER JOIN。 SQL中的常规解决方案会将条件移动到ON子句:

SELECT a.custId, SUM(b.spend)
FROM a LEFT JOIN
     b
     ON b.custId = a.custId AND
        b.date >= #01/01/2016# AND b.date <= #31/12/2016#
GROUP BY a.custId;

但是,我认为这在MS Access中无效。相反,使用子查询:

SELECT a.custId, SUM(b.spend)
FROM a LEFT JOIN
     (SELECT *
      FROM b
      WHERE b.date >= #01/01/2016# AND b.date <= #31/12/2016#
     ) as b
     ON b.custId = a.custId
GROUP BY a.custId;

答案 1 :(得分:0)

问题是WHERE语句在FROM子句之后被计算,因此它连接然后缩小日期。 请改用:

SELECT a.custID, SUM(c.spend) FROM 
(SELECT * FROM b WHERE b.date >= #01/05/2016# AND b.date <= #30/05/2016#) as c
RIGHT JOIN a ON c.custID = a.custID
GROUP BY a.custId