2011-06-29 2 views
0

Я ищу, чтобы общее время работы пользователя на каждой партии на его рабочей станции, общая оценочная работа, которая была завершена, сумма, которую заплатили пользователю, и количество неудач, которые пользователь имел за каждый день в этом году. Если я могу объединить все это в один запрос, я могу использовать его в превосходном и форматировании вещей в сводных таблицах и т. Д.Как присоединиться к одной таблице на другую, где userid = userid, но только для этой даты?

EDIT: Я понял, что это возможно сделать только в нескольких запросов, поэтому я сузили свой объем до этого:

SELECT batch_log.userid, 
batches.operation_id, 
SUM(TIME_TO_SEC(ramses.batch_log.time_elapsed)), 
SUM(ramses.tasks.estimated_nonrecurring + ramses.tasks.estimated_recurring), 
DATE(start_time) 
FROM batch_log 
JOIN batches ON batch_log.batch_id=batches.id 
JOIN ramses.tasks ON ramses.batch_log.batch_id=ramses.tasks.batch_id 
JOIN protocase.tblusers on ramses.batch_log.userid = protocase.tblusers.userid 
WHERE DATE(ramses.batch_log.start_time) > "2011-01-01" 
AND protocase.tblusers.active = 1 
GROUP BY userid, batches.operation_id, start_time 
ORDER BY start_time, userid ASC 

перекрестное соединение вызывает проблемы.

ответ

1

Нет, в общем случае, пункт 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, что может или не может дать вам желаемые результаты. Я бы рассмотрел остальные ваши отношения с таблицами и посмотрел, есть ли какие-то дополнительные ограничения, которые необходимо сделать.

+0

Да. Извините, мой вопрос был сформулирован так хреново. Я настолько из моего элемента с этим материалом sql. Я только разработчик уже около 2 лет, и большая часть моего sql была через рельсы (что делает 90%) работы. Я знаю, что у меня есть способы пойти с sql. – davidahines

+0

EDITED вопрос с обновленной версией – davidahines

+0

Кроме того, я знаю, что, вероятно, трудно прочитать файл без отступов, но я действительно просто не уверен в правильном стиле кодирования в SQL – davidahines