Запрос SELECT, GROUP BY и COUNT - PullRequest
0 голосов
/ 01 мая 2020

У меня есть пример таблицы ниже,

+-------------+-------------+-------------+----------+------------+---------------------------------+----------+---------------+
| employee_id | first_name  | last_name   | email    | joined_date| title                           | salary   | supervisor_id |
+-------------+-------------+-------------+----------+------------+---------------------------------+----------+---------------+
|         100 | John        | King        | EM1      | 1984-06-17 | CEO                             | 14000.00 |          NULL |
|         101 | Leona       | Kochhar     | EM2      | 1993-09-21 | COO                             | 10000.00 |           100 |
|         102 | Lex         | De Haan     | EM3      | 1992-01-13 | CFO                             | 9000.00  |           100 |
|         103 | Alexander   | Hunold      | EM4      | 2001-04-03 | Gamer                           |  5000.00 |           102 |
|         104 | Dave        | William     | EM5      | 2002-05-21 | Gamer                           |  2000.00 |           103 |
|         105 | David       | Austin      | EM6      | 2002-06-25 | Gamer                           |  2800.00 |           103 |
|         106 | Valli       | Longwind    | EM7      | 2002-02-43 | Gamer                           |  2800.00 |           103 |

Некоторые сотрудники являются руководителями других сотрудников в этой таблице. Обратите внимание, что supervisor_id - это employee_id.

Мне поручено использовать инструкцию SELECT только для получения employee_id, first_name, оклада супервизоров и общего числа сотрудников под супервизором.

In мой разум, я знаю, что мне нужно будет использовать какую-то группировку и считать. Во-первых, СЧИТАЙТЕ количество сотрудников под каждым руководителем, а затем - идентификатор руководителя BY. Мне удалось получить выходные данные, используя простые COUNT и GROUP BY, используя этот запрос:

SELECT employee_id, COUNT(supervisor_id)
FROM EMPLOYEE
GROUP BY supervisor_id;

Это выводит supervisor_id и количество сотрудников в supervisor_id. Что является:

+---------------+----------------------+
| supervisor_id | COUNT(supervisor_id) |
+---------------+----------------------+
|          NULL |                    0 |
|           100 |                    2 |
|           101 |                    0 |
|           102 |                    0 |
|           103 |                    3 |

* Таблица выше слегка изменена - это пример вывода

Как уже упоминалось, supervisor_id - это employee_id сотрудника в той же таблице. Моя проблема в том, что я не могу заставить эту таблицу отображать employee_id, first_name и salary вместе со столбцом COUNT. Конечный результат должен показывать employee_id (связанный с supervisor_id), first_name, salary, COUNT.

Я пробовал это

SELECT employee_id, first_name, salary, COUNT(supervisor_id)
FROM EMPLOYEE
GROUP BY employee_id, first_name, salary, supervisor_id;

Но это просто возвращает исходную таблицу.

Также, когда я пытался это сделать

SELECT employee_id, first_name, salary, COUNT(supervisor_id)
FROM EMPLOYEE
GROUP BY supervisor_id;

Возвращает ошибку «Выражение № 1 списка SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец», что в соответствии с онлайн-описанием того, как я создаю свой запрос (может ' смешивать агрегированные и неагрегированные столбцы?).

Кто-нибудь может мне помочь? Спасибо.

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Пожалуйста, попробуйте это

SELECT E1.supervisor_id,count(E2.supervisor_id) FROM `EMPLOYEE` AS E1
LEFT JOIN (select supervisor_id FROM EMPLOYEE GROUP BY 
supervisor_id) AS E2 ON E1.supervisor_id = E2.supervisor_id
GROUP BY E1.supervisor_id
0 голосов
/ 01 мая 2020

Полагаю, вам просто нужно себя LEFT JOIN здесь:

https://www.db-fiddle.com/f/miLeekBXxoiVV1SxuTYc2c/0

SELECT s.employee_id, s.first_name, s.last_name, s.salary, COUNT(e.employee_id)
FROM employee s
LEFT JOIN employee e
ON e.supervisor_id = s.employee_id
GROUP BY s.employee_id, s.first_name, s.last_name, s.salary;

Кстати, вы упомянули в комментарии, что вы хочу использовать HAVING COUNT() = 0. Вам лучше не использовать HAVING для этой цели, а просто изменить этот запрос на INNER JOIN. Это будет делать то же самое, но более эффективным способом. https://www.db-fiddle.com/f/gM6q1UyagrZ4e1EHRvJ1NU/0

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