MS Access中统计去重账户数:如何统计至少有一次RET活动的账户数量?
解决统计至少有一次退货活动的账户数量问题
我来帮你梳理下问题所在,以及正确的解决思路~
首先咱们看看你之前的SQL语句为什么会返回错误结果:
你的原语句:
Select DISTINCT Count(Activities.AccountName) AS CountOfAccountName FROM Activities GROUP BY Activities.ActivityType HAVING (Activities.ActivityType = "RET")
问题出在这两点:
GROUP BY Activities.ActivityType会把所有记录按活动类型分组,用HAVING筛选出RET组后,Count(Activities.AccountName)统计的是该组内所有记录的数量(包括同一个账户多次退货的重复记录),而不是去重后的账户数。- 这里的
DISTINCT完全起不到作用,因为GROUP BY后针对RET类型只会返回一行结果,DISTINCT对单个数值没有去重效果。
正确的SQL写法有两种:
方法一:直接用COUNT(DISTINCT)配合WHERE过滤
这是最简洁的写法,先筛选出所有退货(RET)的记录,再统计其中唯一的账户数量:
SELECT COUNT(DISTINCT AccountName) AS CountOfAccountName FROM Activities WHERE ActivityType = 'RET';
方法二:通过子查询先获取唯一账户,再统计数量
这种写法和你之前执行的SELECT DISTINCT Activities.AccountName FROM Activities WHERE ActivityType = "RET"结果对应,外层直接统计子查询里的行数:
SELECT COUNT(*) AS CountOfAccountName FROM ( SELECT DISTINCT AccountName FROM Activities WHERE ActivityType = 'RET' ) AS UniqueRETAccounts;
这两种方法都能准确统计出至少有一次RET活动的账户总数,不会重复计算同一个账户的多次退货记录。
内容的提问来源于stack exchange,提问作者Sean Hill
相关产品推荐
相关产品推荐

