Имея пункт не фильтрует записи MySQL - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь получить total sum of hours для каждого project_type для конкретного year и, следовательно, в результате одну строку.

Вот мой SQL-запрос:

select SUM(total_hours) as hours, year(task_completion) as year
from task_details
group by project_type_id
having year = '2018' AND project_type_id = 10

Кроме того, вот как выглядит мой набор данных:

project_type_id  |   total_hours   |  task_completion
-------------------------------------------------------
10               |   5             |  2018-9-10
10               |   4             |  2018-9-11
10               |   10            |  2017-9-10
10               |   2             |  2016-9-10
11               |   9             |  2017-9-10
14               |   8             |  2017-9-11

Запрос дает вывод в виде:

hours  |  year
---------------
21     |  2018

Но я ожидал, что он будет 9.

Что не так с запросом?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Ваша логика запроса просто отключена.У вас есть GROUP BY использование разных неагрегированных столбцов в SELECTHAVING есть столбцы, которые не агрегированы и не в GROUP BY.MySQL расширяет свой синтаксис, чтобы позволить это.Однако запрос (и результаты) не имеют смысла.

Ваш запрос должен выглядеть следующим образом:

select sum(total_hours) as hours, year(task_completion) as year
from task_details
where project_type_id = 10
group by year
having year = 2018;

В чем разница?Примечание:

  • Сравнение для project_type_id содержится в предложении WHERE до агрегации , а не после агрегации.
  • Предложение GROUP BY содержитнеагрегированные столбцы из SELECT.
  • year - это число, поэтому сравнение проводится с числом, а не строкой.

Я бы посоветовал вам сделать все сравнения перед агрегацией - поэтому не требуется having:

select sum(total_hours) as hours,
       year(task_completion) as year
from task_details
where project_type_id = 10 and
      task_completion >= '2018-01-01' and
      task_completion < '2019-01-01'
group by year;

Обратите внимание, что в этой версии не используется year().Функции на столбцах могут препятствовать использованию индексов.Эта версия может использовать индекс на (project_type_id, task_completion).

0 голосов
/ 10 октября 2018

Вам необходимо использовать условие для года и project_type_id в where вместо having, в противном случае это были суммы значений за весь год:

select project_type_id, 
       SUM(total_hours) as hours, 
       year(task_completion) as year_completion
from task_details
WHERE year(task_completion) = 2018 
 and project_type_id = 10
group by project_type_id 
...