2017-02-09 5 views
2

ПРЕДУПРЕЖДЕНИЕ: Я знаю this вопрос - это НЕ, как у меня, потому что я добавил пункт в моем запросе GROUP BY и она до сих пор не работает.Агрегатная функция после того, как условие возвращения пустое множество


Мне нужно выбрать максимальное значение временного столбца project_count.

Это запрос:

SELECT employee_id, COUNT(*) AS project_count FROM Employees WHERE project_level = 'L1' AND YEAR(Employees.project_date) = '2017' GROUP BY employee_id HAVING project_count = MAX(project_count); 

Если удалить пункт HAVING, выход, как в следующем:

+-------------+---------------+ 
| employee_id | project_count | 
+-------------+---------------+ 
|   1 |    2 | 
|   2 |    1 | 
|   3 |    3 | 
|   5 |    1 | 
+-------------+---------------+ 

Однако, если включить предложение HAVING (что мне нужно использовать, чтобы узнать максимальное значение project_count), выход представляет собой пустой набор; но это должно быть так:

+-------------+---------------+ 
| employee_id | project_count | 
+-------------+---------------+ 
|   3 |    3 | 
+-------------+---------------+ 
+0

См. Http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple- sql-query – Strawberry

+0

У вас есть два «слоя» группировки, но они только указывают; помните, что 'MAX (project_count)' такой же, как 'MAX (COUNT (*))', сгруппированный employee_id. Я удивлен, что MySQL не отклонил запрос; и что он решил не возвращать строки, а не все из них, когда он ее принял. – Uueerdo

ответ

4

Если вы хотите только одну строку с максимальным кол, вы можете использовать limit:

select employee_id, COUNT(*) as project_count 
from Employees 
where project_level = 'L1' 
    and YEAR(Employees.project_date) = 2017 
group by employee_id 
order by project_count desc limit 1 

Если вы хотите, чтобы все из них с максимальным кол:

select employee_id, COUNT(*) as project_count 
from Employees 
where project_level = 'L1' 
    and YEAR(Employees.project_date) = 2017 
group by employee_id 
having COUNT(*) = (
     select max(cnt) 
     from (
      select COUNT(*) cnt 
      from Employees 
      where project_level = 'L1' 
       and YEAR(Employees.project_date) = 2017 
      group by employee_id 
      ) t 
     ) 
Смежные вопросы