如何解决在ACCESS查询中强制NULL条目
我有两个如下的访问表
CustId CustType
1 Silver
2 Gold
3 Gold
xDate CustId Value
01/01/2020 2 100
01/01/2020 1 50
02/02/2020 2 100
03/01/2020 2 200
03/01/2020 1 50
04/01/2020 2 100
04/01/2020 3 100
我想知道两个日期之间为Gold
客户花费的总金额,并设置以下查询:
SELECT a.CustId,SUM(t.Value) AS Total
FROM Transactions AS t
LEFT JOIN
(
SELECT CustId FROM Customers WHERE CustType = 'Gold'
) a
ON a.CustId = t.CustId
WHERE t.xDate BETWEEN #2020/01/03# AND #2020/01/04#
AND NOT a.CustId IS NULL
GROUP BY a.CustId;
这给了我以下内容:
2 300
3 100
如果我将查询更改为BETWEEN #2020/01/02# AND #2020/01/03#
,我会得到:
2 200
到目前为止,一切都很好。但是,对于第二个查询,我希望Gold
个客户的总交易价值为零(或NULL),即使他们在此期间没有花任何钱,即
2 200
3 0
我相信我可以使用LEFT OUTER JOIN
以其他dB的方式执行此操作,但这在ACCESS中不可用。这篇帖子How do I write a full outer join query in access建议使用UNION
。我的尝试是
SELECT c.CustId,0 as Total
FROM Customers c
WHERE c.CustType = 'Gold'
UNION
SELECT t.CustId,SUM(t.Value) AS Total
FROM Transactions t
WHERE t.xDate BETWEEN #2020/01/03# AND #2020/01/04#
GROUP BY t.CustId;
但这产生了以下结果:
CustId Total
1 50
2 0
2 200
3 0
此结果包含所有类型的客户,并且有一个客户2的重复项。如果您知道方法,但我只是不知道,我相信答案是显而易见的!感谢所有收到的建议-谢谢!
解决方法
如果您想获得所有Gold客户,那么Customers
应该是LEFT JOIN
中的第一张表。也不需要在customers
上进行子查询。但是,MS Access确实需要Transactions
上的一个:
SELECT c.CustId,NZ(SUM(t.Value)) AS Total
FROM Customers as c LEFT JOIN
(SELECT t.*
FROM Transactions as t
WHERE t.xDate BETWEEN #2020/01/03# AND #2020/01/04#
) as t
ON t.CustId = c.CustId
WHERE c.CustType = 'Gold'
GROUP BY c.CustId;
,
编辑: 简化查询
SELECT Customers.CustID,Sum(Transactions.tValue) AS Total
FROM Customers LEFT JOIN Transactions ON Customers.CustID = Transactions.CustID
WHERE (Transactions.xDate BETWEEN #2020/01/03# AND #2020/01/04#) AND (Customers.CustType='Gold')
GROUP BY Customers.CustID;
您可以按客户ID对联合查询结果组的总数求和。尝试以下
我假设您的CustID
字段是Number
数据类型。如果是字符串数据类型,则需要更改DLookup()
函数标准部分,例如DLookup("CustType","Customers","CustID='" & t.CustID & "'")
SELECT ut.CustID,Sum(ut.Total) AS Total
FROM (SELECT c.CustId,0 as Total,c.CustType
FROM Customers AS c
GROUP BY c.CustId,c.CustType
UNION
SELECT t.CustId,SUM(t.tValue) AS Total,DLookup("CustType","CustID=" & t.CustID ) as CustType
FROM Transactions AS t
WHERE t.xDate BETWEEN #2020/01/03# AND #2020/01/04# GROUP BY t.CustId) AS ut GROUP BY ut.CustID,ut.CustType
HAVING (((ut.CustType)='gold'));
,
考虑:
查询1:
SELECT CustId,SUM(Value) AS Total
FROM Transactions
WHERE xDate BETWEEN #2020/02/01# AND #2020/03/01#
GROUP BY CustId;
Query2:
SELECT Customers.CustID,Query1.Total
FROM Customers LEFT JOIN Query1 ON Customers.CustID = Query1.CustId
WHERE (((Customers.[CustType])="Gold"));
,
LEFT OUTER JOIN
在Access-SQL中仅称为LEFT JOIN
,通常可以按预期工作。
有关其用法和限制的更多信息,请参见here。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。