我有两个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中的客户的支出,而忽略其余的客户。我很确定我一定做错了查询,但不知道是什么。感谢所有建议。谢谢!
答案 0 :(得分:2)
在MS Access中很难做到这一点。首先,请注意您似乎想要&#34; a&#34;表首先,而不是第二,所以你保留所有客户。
WHERE
将LEFT 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