Sql 如何对不存在的记录进行计数?
如何对不存在的记录进行计数,这些记录应以“0”作为计数 这是我的桌子: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
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!