微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在ACCESS查询中强制NULL条目

如何解决在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 举报,一经查实,本站将立刻删除。