Запрос SQL не возвращает значения NULL, несмотря на использование IFNULL (MySQL) - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть тестовая таблица, настроенная так: Настройка строк таблицы

Моя цель - попытаться получить количество отделов, которые были созданы до текущего отдела.Мой SQL:

SELECT A.Department, IFNULL(COUNT(*), 0) 
FROM Departments A
INNER JOIN Departments B ON B.YearOfEstablishment < A.YearOfEstablishment
GROUP BY Department
ORDER BY COUNT(*);

Однако я пробовал и LEFT JOIN и INNER JOIN, последний отдел, который был найден первым, никогда не возвращается, потому чтоЯ могу предположить, что это ноль.Несмотря на наличие IFNULL, отдел не отображается.

Что я здесь не так делаю?

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

Вы также можете сделать что-то вроде этого:

SELECT
      A.Department
    , A.YearOfEstablishment
    , COUNT(*) - 1
FROM
    Departments A
    INNER JOIN Departments B ON (
           A.id = B.id
        OR B.YearOfEstablishment < A.YearOfEstablishment
    )
GROUP BY
    Department
ORDER BY
    COUNT(*);
0 голосов
/ 04 февраля 2019

В MySQL 8+ вы можете лучше сделать это, используя rank() или row_number():

SELECT d.Department,
       ROW_NUMBER() OVER (ORDER BY YearOfEstablishment) - 1 as seqnum
FROM Departments d
ORDER BY seqnum;

Без связей это будет то же самое, что ваш запрос.Может быть лучше сделать:

SELECT d.Department,
       RANK() OVER (ORDER BY YearOfEstablishment) - 1 as seqnum
FROM Departments d
ORDER BY seqnum;

Это должно быть количество, которое вы ищете.

0 голосов
/ 04 февраля 2019

Я думаю, что это запрос, который вам нужен:

SELECT A.Department, COUNT(B.Department)
FROM Departments A
LEFT JOIN Departments B ON B.YearOfEstablishment < A.YearOfEstablishment
GROUP BY A.Department
ORDER BY 2;

См. эта демонстрационная версия скрипты БД .

| Department        | cnt |
| ----------------- | --- |
| Office Management | 0   |
| Business          | 1   |
| Sales Management  | 2   |
| ComputerScience   | 3   |
| Liberal Arts      | 4   |
| Farming           | 4   |
| Communications    | 6   |
| Digital Science   | 7   |

NB: как прокомментировал @fifonik, IFNULL не требуется, поскольку COUNT уже возвращает 0, когда нет доступных записей.

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