SQL JOIN 未按预期工作

SQL JOINs not working as expected

我有两个 MS ACCESS table像这样的 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

我期望从 table 获得一个包含所有客户 ID 的记录集,其中包含总支出(如果他们活跃)或 NULL(如果他们不活跃)。但仅访问 returns 一月份 ID 出现在 Table b 中的客户的支出,而忽略其余部分。我相当确定我一定对查询做错了,但不知道是什么。非常感谢收到所有建议。谢谢!

这在 MS Access 中很难做到。首先,请注意您似乎首先想要 "a" table,而不是其次,因此您可以留住所有客户。

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;

问题在于 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