Нет, в общем случае, пункт Having
используется для фильтрации результатов вашего Group by
- например, только для тех, кто был оплачен более 24 часов в сутки (HAVING SUM(ramses.timesheet_detail.paidTime) > 24
). Если вам не нужно выполнять фильтрацию результатов агрегата, вам не нужно вообще устанавливать having
.
Большинство этих условий следует переместить в предложение where
или как часть соединений по двум причинам: 1) Фильтрация должна выполняться как можно скорее, чтобы ограничить работу, которую должен выполнить запрос. 2) Если фильтрация уже выполнена, повторное ее выполнение может привести к выполнению запроса дополнительной, ненужной работы.
Из того, что я видел до сих пор, кажется, что вы пытаетесь свернуться с каждым днем - попробуйте изменить последний столбец в разделе group by
на date(ramses.batch_log.start_time)
, или вы группируете (что я предполагаю) отметка времени.
EDIT:
О имен схем - да, вы можете назвать их в секциях
from
и
join
. Часто также запрос может разрешать необходимые схемы на основе некоторого списка поиска по умолчанию (как или если это зависит от вашей базы данных).
Вот как я бы переформатировать запрос:
SELECT tblusers.userid, operations.name AS name,
SUM(TIME_TO_SEC(batch_log.time_elapsed)) AS time_elapsed,
SUM(tasks.estimated_nonrecurring + tasks.estimated_recurring) AS total_estimated,
SUM(timesheet_detail.paidTime) as hours_paid,
DATE(start_time) as date_paid
FROM tblusers
JOIN batch_log
ON tblusers.userid = batch_log.userid
AND DATE(batch_log.start_time) >= "2011-01-01"
JOIN batches
ON batch_log.batch_id = batches.id
JOIN operations
ON operations.id = batches.operation_id
JOIN tasks
ON batches.id = tasks.batch_id
JOIN timesheet_detail
ON tblusers.userid = timesheet_detail.userid
AND batch_log.start_time = timesheet_detail.for_day
AND DATE(timesheet_detail.for_day) = DATE(start_time)
WHERE tblusers.departmentid = 8
GROUP BY tblusers.userid, name, DATE(batch_log.start_time)
ORDER BY date_paid ASC
Особую озабоченность вызывает batch_log.start_time = timesheet_detail.for_day
линия, которая сравнивает (то, что подразумевается, чтобы быть) метки времени. Действительно ли они равны? Я ожидаю, что один или оба из них должны быть обернуты функцией date()
.
Что касается того, почему вы можете получать неожиданные данные - вы, кажется, устранили некоторые из ваших условий соединения. Не зная точную настройку и использование вашей базы данных, я не могу дать точную причину ваших результатов (или даже могу сказать, что они ошибаются), но я думаю, что факт, что вы присоединяетесь к таблице operations
без какого-либо условия join
, вероятно, винить - если в этой таблице есть 2 записи, это удвоит все ваши предыдущие результаты, и похоже, что их может быть 12. Вы также удалили operations.name
из предложения group by
, что может или не может дать вам желаемые результаты. Я бы рассмотрел остальные ваши отношения с таблицами и посмотрел, есть ли какие-то дополнительные ограничения, которые необходимо сделать.
Да. Извините, мой вопрос был сформулирован так хреново. Я настолько из моего элемента с этим материалом sql. Я только разработчик уже около 2 лет, и большая часть моего sql была через рельсы (что делает 90%) работы. Я знаю, что у меня есть способы пойти с sql. – davidahines
EDITED вопрос с обновленной версией – davidahines
Кроме того, я знаю, что, вероятно, трудно прочитать файл без отступов, но я действительно просто не уверен в правильном стиле кодирования в SQL – davidahines