Запрос, который предоставляет имена рекрутеров, которые нанимают более 3 сотрудников, и количество сотрудников, которые не были наняты рекрутером

#mysql #sql #group-by #left-join #group-concat

Вопрос:

Я немного застрял в этом вопросе и надеялся на некоторую помощь. Вот где я нахожусь в настоящее время.

У меня есть эта ТЕСТОВАЯ таблица имен. Каждый человек может быть либо рекрутером, либо сотрудником. Число в Recruited_by связано с person_id .

 Person_id   Name    Recruited_by

1   Jean Grayson    1    
2   Paul Smith      7    
3   John Do         Null    
4   Alex Lee        7    
5   Lisa Kim        7    
6   Bob Thompson    3    
7   Mike Keen       Null    
8   Raymond Red     3    
9   Alisson Jones   1    
10  Kate James      3
 

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

 SELECT T.Name as Employees, COUNT(T1.Name) as Not_hired
FROM Test AS T
WHERE COUNT(T1.Name) IS NULL
LEFT OUTER JOIN Test AS T1
ON T.Recruited_by = T1.Person_id
GROUP BY T.Name
HAVING COUNT(T1.Name) > 3
 

Однако этот запрос ничего не возвращает, когда я должен ожидать, что он вернет количество сотрудников, которые не были наняты рекрутером!

Комментарии:

1. Агрегатная функция не используется в предложении WHERE . Пожалуйста, поместите предложение WHERE после предложения ON и без aggregate. Пожалуйста, укажите ожидаемый результат.

2. Вы запрашиваете 2 разных результата, которые нельзя объединить. Каков ваш ожидаемый результат?

3. @RahulBiswas Я ожидаю увидеть что-то в одном столбце, в котором будет указано Имя, которое будет равно Null, и в другом столбце, в котором будет указано Not_hired, в котором будет отображаться числовое значение 2.

4. Если есть 5 рекрутеров, которые наняли более 3, то в результатах будет 5 строк с 5 именами в 1 столбце и числом 2 в другом столбце 5 раз?

Ответ №1:

Если вы хотите, чтобы в результатах была только 1 строка с 2 столбцами, вы можете выполнить ЛЕВОЕ объединение таблицы с запросом, который объединяет, чтобы получить идентификаторы лиц, которые наняли более 3 человек, и снова объединить, чтобы получить количество лиц, которые никем не были наняты:

 SELECT GROUP_CONCAT(CASE WHEN t2.Recruited_by IS NOT NULL THEN t1.Name END ORDER BY t1.Name) names,
       SUM(t1.Recruited_by IS NULL) total_not_recruited
FROM Test t1 
LEFT JOIN (
  SELECT Recruited_by
  FROM Test
  GROUP BY Recruited_by
  HAVING COUNT(*) > 3
) t2 ON t2.Recruited_by = t1.Person_id;
 

Вы получите имена людей, которые наняли более 3 человек (если они существуют) в виде списка, разделенного запятыми.

Смотрите демонстрацию.