2016-06-02 2 views
2

Я отредактировал запрос, выбрав все данные Сотрудников, которые провели оценки за последние шесть недель. По логике он должен каждый сотрудник два раза, если он выполнил оценки за две недели, но этот запрос показывает одну запись.Mysql Получить данные за последние шесть недель, используя JOIN

select 
    AssessmentEmployee. 
    EmployeeName, 
    AVG(AssessmentListing.AssessmentScore), 
    DATE_FORMAT((STR_TO_DATE(`AssessmentSubmittedDatetime`, '%d-%b-%Y %I:%i %p')) , '%Y-%m-%v') as _month 
from AssessmentEmployee 
LEFT JOIN AssessmentListing 
ON AssessmentEmployee.AssessmentID=AssessmentListing.AssessmentID 
WHERE (STR_TO_DATE(`AssessmentSubmittedDatetime`, '%d-%b-%Y %I:%i %p') >= DATE_FORMAT(NOW() - INTERVAL 6 Week, '%Y')) 
group by AssessmentEmployee.EmployeeName 

У меня есть следующая таблица, которую я использую.

AssessmentEmployee 
ID 
AssessmentID 
EmployeeName 

Другой таблица AssessmentListing

ID 
AssessmentID 
AssessmentSubmittedDateTime 
AssessmentScore 

Я хочу, чтобы сотрудники, которые имеют надрез/сделал оценку в последних неделях секса и их среднего балл.

Образец столбца данных из AssessmentListing

ID AssessmentID  AssessmentSubmittedDatetime  AssessmentScore 
1  040416024720  04-Apr-2016 02:48 PM    50 
+0

Вам нужно сгруппировать по «номеру недели» и «имя сотрудника» вместе. – 1000111

+0

Когда вы говорите 'group by AssessmentEmployee.EmployeeName', который просит все данные для каждого значения' EmployeeName' суммироваться в одну строку. Так что, конечно, вы получите только одну строку для каждого (а не те, которые вы ожидали). – Turophile

+0

@Turophile Я хочу, чтобы это позволило сказать, что Адам и Джексон сделали за последние две недели. Так что это должно проявляться для обоих, а также если какая-либо неделя за последние шесть недель не имеет записи, чем в предыдущие недели, то не следует брать другие недели –

ответ

0

Пожалуйста, попробуйте следующий запрос:

select 
    AssessmentEmployee. 
    EmployeeName, 
    AVG(AssessmentListing.AssessmentScore), 
    DATE_FORMAT((STR_TO_DATE(`AssessmentSubmittedDatetime`, '%d-%b-%Y %I:%i %p')) , '%Y-%v') as year_week 
from AssessmentEmployee 
LEFT JOIN AssessmentListing 
ON AssessmentEmployee.AssessmentID=AssessmentListing.AssessmentID 
WHERE UNIX_TIMESTAMP(DATE_FORMAT(STR_TO_DATE(`AssessmentSubmittedDatetime`,'%d-%b-%Y %I:%i %p'),'%Y-%m-%d')) >= UNIX_TIMESTAMP(CURDATE() - INTERVAL 6 WEEK) 
group by AssessmentEmployee.EmployeeName, year_week; 

Вы не должны дата магазин/времени в виде строки. В противном случае охватите эти громоздкие задания при их обработке.

+0

Вы правы, но я не думал, что мы будем получать для отчета, как это, поэтому зачем использовать –

+0

Так скажите, что я сделал эту работу? вы получаете ожидаемый результат? @DilshadAli – 1000111

+0

Я выхожу, но позвольте мне подтвердить –

0

вы делаете в среднем, так что в среднем на 2 очка, если они принимают его в два раза.

0
SELECT *, SUM(AssessmentScore) as total, SUM(AssessmentScore)/6 as avg 
FROM `assessmentlisting` 
WHERE STR_TO_DATE(`AssessmentSubmittedDatetime`, '%d-%b-%Y %I:%i %p') > DATE_FORMAT(NOW() - INTERVAL 6 Week, '%Y-%m-%d %I:%i %p') 
GROUP BY assessmentlisting.AssessmentID 

Надеюсь, что это сработает.

Смежные вопросы