[英]SQL count() with group by not returning 0/zero records
為便於討論,請考慮Access中的這個基本表(Test)...
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
我想要計算某個部門中某個角色的用戶。 如果我做一個簡單的count(),我得到正確的0返回:
SELECT COUNT(ID) as ct
FROM Test
WHERE role >=101 and division=1;
產量
division ct
1 0
但是,我想在結果中包含分區編號(為了進一步加入,報告等),它總是返回null / no行而不是div和count 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
2 3
代替
division ct
1 0
2 3
4 0
如果計數為0,是否不可能將除數與計數一起返回?
這個怎么樣:
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)
執行此操作的最佳方法是創建第二個表,列出所有分區(可以是單個列),然后LEFT(或右鍵)將其加入查詢,因此您確定它將列出所有分區。
這適用於SQL服務器,所以也許......
SELECT division, COUNT(ID) AS ct
FROM Test
WHERE role >= 101
GROUP BY ALL division
HAVING division = 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表,只有一個記錄。我確信在聯合中添加記錄有更優雅的方式,但我希望這個想法來對面。)
然后,在此記錄集上按分區運行count(ID)組(可能是臨時查詢),並從計數中減去虛擬記錄(因此select子句將是
SELECT division, count(ID)-1
您是否嘗試過使用count(*)而不是count(ID)?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.