Sql 如何对不存在的记录进行计数?

Sql 如何对不存在的记录进行计数?,sql,ms-access,Sql,Ms Access,如何对不存在的记录进行计数,这些记录应以“0”作为计数 这是我的桌子: CREATE TABLE SURVEY (year CHAR(4), cust CHAR(2)); INSERT INTO SURVEY VALUES ('2011', 'AZ'); INSERT INTO SURVEY VALUES ('2011', 'CO'); INSERT INTO SURVEY VALUES ('2012', 'ME'); INSERT INTO SURVEY VALUES ('2014', 'M

如何对不存在的记录进行计数,这些记录应以“0”作为计数

这是我的桌子:

CREATE TABLE SURVEY
(year CHAR(4),
cust CHAR(2));
INSERT INTO SURVEY VALUES ('2011', 'AZ');
INSERT INTO SURVEY VALUES ('2011', 'CO');
INSERT INTO SURVEY VALUES ('2012', 'ME'); 
INSERT INTO SURVEY VALUES ('2014', 'ME'); 
INSERT INTO SURVEY VALUES ('2014', 'CO');
INSERT INTO SURVEY VALUES ('2014', 'ME'); 
INSERT INTO SURVEY VALUES ('2014', 'CO');
我已经试过了,但它当然没有计数:

select cust, year, count(*) as count from SURVEY
group by cust, year
我想得到这个结果:

+------+---------+--------+
| cust |    year |  count |
+------+---------+--------+
| AZ   |    2011 |  1     |
| AZ   |    2012 |  0     |
| AZ   |    2014 |  0     |
| CO   |    2011 |  1     |
| CO   |    2012 |  0     |
| CO   |    2014 |  2     |
| ME   |    2011 |  0     |
| ME   |    2012 |  1     |
| ME   |    2014 |  2     |
+------+---------+--------+
请注意:

我的桌子上有许多记录~10k,有不同的“客户” 年份可能不是连续的,例如跳过2013年 随着时间的推移,我可能会有2015年、2016年等等 实际查询将在MS_ACCESS的2010中执行,但不确定其是否重要 请帮忙,谢谢

select cust, year, (select count(cust) from survey) as count
  from SURVEY
group by cust, year

但此查询将返回所有记录的计数,而不带组条件。

听起来好像您希望在不存在调查记录的情况下,每个客户x年组合的计数都为零。如果是这种情况,您将需要另外两个表:customers和years,然后执行以下操作:

    select leftside.cust, leftside.year, count(survey.cust) from
(select * from customers, years) as leftside left join survey
on leftside.cust = survey.cust and 
leftside.year = survey.year 
group by leftside.cust, leftside.year

如果您有一个年和客户的域表:

select y.year, c.cust, count(s.year) as cnt
from customer as c
cross join year as y
left join survey as s
    on s.year = y.year
    and s.cust = c.cust
group by y.year, c.cust
如果ms access没有交叉连接,您可以对以下各项执行相同的操作:

from customer as c
join year as y
    on 1 = 1

如果你没有域表,你就需要发明域,因为你不能无中生有。

如果你像其他人说的那样有域表,那就好了。如果您必须只依赖表中的数据,那么下面的查询将为您做到这一点

select cp.cust, cp.year, iif(isnull(sum(cnt)), 0, sum(cnt)) as count from
(select * from (
 (select distinct cust from survey) as c cross join
 (select distinct year from survey) as y)
) cp left join
(select *, 1 as cnt from survey) s on cp.cust=s.cust and cp.year=s.year
group by cp.cust, cp.year
order by cp.cust,cp.year

如果可行的话,可以使用coalescesumcnt,0代替iifisnullsumcnt,0,sumcnt。在MS Access中使用iif函数,在其他数据库中使用coalesce works。

不是我想要的,需要有正确的计数。嗯,我得到了错误的计数AZ,2012年得到了1个计数,应该是零,请看哦,对不起。这应该是一年。我会更新answersql代码,但请您澄清ms access代码。我有错误,这是你的意思吗?选择y.year,c.cust,counts.year作为cnt从客户处作为c加入年份作为y在1=1左侧加入调查作为s在s.year=y.year和s.cust=c.cust组按y.year,c.cust是的,我没有访问权限,因此无法验证,但这就是有人建议Access在任何包含多个join的查询的FROM子句中需要括号的想法,我用cross-join代替了使用。。现在它似乎正在工作,请检查前面评论中的sqlfiddle链接,看看它是否工作。或者它在MS Access中不起作用?sqlfiddle很有用,修复了它并编辑了问题,现在似乎可以了是的,谢谢,它起作用了。它也适用于ms access!