SQL count () с группой, не возвращая 0 / ноль записей - PullRequest
3 голосов
/ 16 декабря 2009

Для простоты обсуждения рассмотрим эту базовую таблицу (Тест) в Access ...

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

Тем не менее, я хочу включить в результаты номер деления (для дальнейшего объединения, отчетов и т. Д.), И он всегда возвращает ноль / нет строк вместо деления и счет 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?

Ответы [ 5 ]

4 голосов
/ 16 декабря 2009

Как насчет этого:

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)
2 голосов
/ 17 декабря 2009

Это работает на сервере SQL, так что, возможно ...

SELECT  division, COUNT(ID) AS ct
FROM    Test
WHERE   role >= 101
GROUP BY ALL division
HAVING  division = 1 ;
2 голосов
/ 16 декабря 2009

Лучший способ сделать это - создать вторую таблицу, в которой перечислены все подразделения (может быть один столбец), а затем ВЛЕВО (или вправо) присоединить его к вашему запросу, поэтому вы уверены, что в нем будут перечислены все подразделения.

1 голос
/ 17 декабря 2009

Я не совсем уверен, как правильно сделать это в 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

(По сути, это утверждение добавляет фиктивную запись для каждого подразделения. Dual - фиктивная таблица Oracle с одной записью. Я уверен, что есть более элегантный способ добавления записей в объединение, но я надеюсь, что идея натолкнется.)

Затем запустите подсчет (ID) по группам для этого набора записей (это может быть временный запрос) и вычтите фиктивную запись из числа (так что предложение select будет

SELECT division, count(ID)-1
0 голосов
/ 17 декабря 2009

Вы пытались использовать счет (*) вместо счет (ID)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...