2009-12-16 53 views
3

为了便于讨论,认为这基本表(测试)在访问...SQL计数()与组通过不返回0 /零记录

ID division name role 
1 1  Frank 100 
2 2  David 101 
3 3  John 101 
4 2  Mike 102 
5 2  Rob 102 
7 3  Dave 102 
8 3  Greg 102 

我想算有一定角色的用户在一个部门。如果我做一个简单的计数(),我得到正确的返回0:

SELECT COUNT(ID) as ct 
FROM Test 
WHERE role >=101 and division=1; 

产生

division ct 
    1  0 

不过,我想在结果中包括(分区编号为进一步加入清酒,报告等),并且它总是返回null /没有行,而不是划分和0计数:

SELECT division, COUNT(ID) as ct 
FROM Test WHERE role >=101 
GROUP BY division 
HAVING division=1; 

SELECT division, COUNT(ID) as ct 
FROM Test 
WHERE role >=101 AND division=1 
GROUP BY division; 

产生

division ct 

我最初来到这一点,因为我想如果用户输入一个部门,是不是在表(如4)也很喜欢这个工作,...

SELECT division, COUNT(ID) as ct 
FROM Test 
WHERE role >=101 AND division IN (1,2,4) 
GROUP BY division; 

产生

​​

代替

division ct 
    1  0 
    2  3 
    4  0 

如果计数为0,是否不可能返回除计数以外的除法?

+1

你肯定第一个“收益率”,这似乎违背你的问题? – 2009-12-16 20:46:22

+1

它的正确性,“WHERE division = 1”的限制因素不会伤害它,只是试图在结果中返回除法值而打破它。 – BikeMrown 2009-12-16 20:54:58

+0

你可以自己加入这个,SELECT分区,Count(ID)作为ct FROM Test RIGHT JOIN(从分组中选择分区)AS列表WHERE ..... – MindStalker 2009-12-16 21:21:20

回答

4

如何:

SELECT division, ISNULL(ct,0) AS ct 
FROM divisionTable 
LEFT JOIN 
(SELECT division, COUNT(ID) as ct FROM Test WHERE role >=101 GROUP BY division) CountQuery 
ON divisionTable.division = CountQuery.division 
WHERE divisionTable.division IN (1,2,4) 
+1

右,参考表上的LEFT JOIN将显示结果,但我试图避免加入。另外,看起来很奇怪,简单地将我的结果分组到行中的限制分区不再使0的计数显示出来。 – BikeMrown 2009-12-16 20:56:57

+1

你的WHERE子句是什么消除了零计数结果。你正在筛选出任何角色<101且不在1,2或4中的任何东西,那么如果该部分不是结果集的一部分,它如何能够列出除数为零的分区? – flayto 2009-12-16 21:18:11

+0

@BikeMrown这对于SQL来说是正常的 - 你不能计数null - null是特殊的,它不存在,它不是0,它是空的。全部冰雹空。严重的是,如果你想让null表现为0,你需要有另一个表,或者使用ISNULL(),COALESCE(),为空,不为空等。 – Hogan 2009-12-16 21:32:41

2

做的最好的方式,这是创建列出所有部门第二个表(可以是单个列),然后左(或右),其加入到您的查询,所以你确定它会列出所有的部门。

+0

我相信这样也可以更好地标准化数据。 – 2009-12-16 20:52:22

1

我不完全知道如何在Access中正常做到这一点,但这里是确保有总是在结果集中至少有一个排的一个想法:

SELECT * 
FROM Test 
WHERE role >=101 AND division IN (1,2,4) 
UNION 
SELECT 1 as ID, 1 as division, 'Dummy' as Name, 100 as role 
FROM Dual 
UNION 
SELECT 1 as ID, 2 as division, 'Dummy' as Name, 100 as role 
FROM Dual 
UNION 
SELECT 1 as ID, 4 as division, 'Dummy' as Name, 100 as role 
FROM Dual 

(基本上,这声明为每个部门增加了一个Dummy记录Dual是一个虚拟的Oracle表格,只有一条记录,我敢肯定在联盟中有一种更优雅的方式来添加记录,但我希望这个想法能够实现。)

然后,运行您在此记录集上划分的(ID)组,然后从计数中减去虚拟记录(so select子句将是

SELECT division, count(ID)-1 
0

您是否尝试过使用count(*)而不是count(ID)?

+1

count(*)结果相同 – BikeMrown 2009-12-16 21:53:00

1

这个工作在SQL服务器,所以也许......

SELECT division, COUNT(ID) AS ct 
FROM Test 
WHERE role >= 101 
GROUP BY ALL division 
HAVING division = 1 ;