2017-02-10 1 views
2

Попытка получить всех пользователей, есть ли у них часы? Моя LEFT OUTER JOIN до сих пор не работает ..MySQL получает всех пользователей, есть ли у них часы?

SELECT tblleaverequest.lqUser, 
     SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 1 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'Jan', 
     SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 2 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'Feb', 
     SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 3 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'Mar', 
     SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 4 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'Apr', 
     SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 5 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'May', 
     SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 6 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'Jun', 
     SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 7 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'Jul', 
     SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 8 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'Aug', 
     SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 9 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'Sep', 
     SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 10 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'Oct', 
     SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 11 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'Nov', 
     SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 12 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'Dec', 
     SUM(tblleaverequest.lqHoursPL) AS PaidLeaveTotal 

FROM  tblusers LEFT OUTER JOIN tblleaverequest ON tblleaverequest.lqUser = tblusers.username  

WHERE  (tblusers.clr_accrual = '1') AND (YEAR(tblleaverequest.lqStartDate) = YEAR(CURDATE())) 
GROUP BY tblusers.username 

Вот мои результаты, но мне нужно, чтобы остальные пользователи без часов тоже. enter image description here

ответ

3

Не уверен, что о вас дб схемы, но, кажется, вы просто можете переместить одно условие из WHERE к ON п

SELECT tblusers.username, 
    SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 1 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'Jan', 
    SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 2 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'Feb', 
    SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 3 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'Mar', 
    SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 4 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'Apr', 
    SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 5 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'May', 
    SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 6 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'Jun', 
    SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 7 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'Jul', 
    SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 8 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'Aug', 
    SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 9 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'Sep', 
    SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 10 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'Oct', 
    SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 11 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'Nov', 
    SUM(CASE WHEN DATE_FORMAT(tblleaverequest.lqStartDate, '%m') = 12 THEN (tblleaverequest.lqHoursPL) ELSE 0 END) AS 'Dec', 
    SUM(tblleaverequest.lqHoursPL) AS PaidLeaveTotal 

FROM  tblusers 
LEFT OUTER JOIN tblleaverequest 
ON tblleaverequest.lqUser = tblusers.username  
    AND (YEAR(tblleaverequest.lqStartDate) = YEAR(CURDATE())) 
WHERE  (tblusers.clr_accrual = '1') 
GROUP BY tblusers.username 
+0

Darn! Взял слишком длинный набор ;-) – Leigh

+0

@Lyigh copy-paste! ;-) – Alex

+0

Lol .. никоим образом не конкурировать с этим ;-) – Leigh

1
WHERE ... (YEAR(tblleaverequest.lqStartDate) = YEAR(CURDATE())) 

Если нет соответствия в записях tblLeaveRequest, то дата будет null. Поскольку null ничего не может сопоставить, эти записи будут удалены. Таким образом, вы, по сути, конвертируете ВНУТРЕННУЮ ПРИСОЕДИНЬЯ НА ВСТУПЛЕНИЕ ВНУТРЕННЕГО ПРИСОЕДИНЕНИЯ. Переместите это сравнение в оператор JOIN, чтобы сохранить OUTER JOIN.

Update:

Не забудьте захватить имя пользователя из tblusers, так как значение tblleaverequest.lqUser может быть нулевым из-за OUTER JOIN.

SELECT tblusers.username 
     , SUM(CASE ......)) AS Jan 
     , .... 
+0

Ли, ваше «предсказание» по имени пользователя стало реальностью .. Я внес изменения в мой запрос на @Alex, но получал пустых пользователей ... теперь отлично работает. спасибо x10! – jlig

+0

Рад, что это помогло. Просто проверено, и, судя по всему, MySQL корректно обрабатывает нулевые даты, т. Е. Не выдает ошибку. Еще меньше о чем беспокоиться. – Leigh

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