2017-02-10 25 views
2

試圖讓所有的用戶,無論他們有沒有幾個小時?我的左外連接仍然沒有工作..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 

這裏是我的結果,但我需要有用戶的其他W/O小時了。 enter image description here

回答

3

不知道你的DB模式,但似乎你只可以移動一個條件從WHEREON條款

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

該死!打字太久了;-) – Leigh

+0

@Leigh複製粘貼! ;-) – Alex

+0

大聲笑..沒辦法與那個競爭;-) – Leigh

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

如果在記錄tblLeaveRequest不匹配時,日期將是null。由於null不能等於任何東西,這些記錄將被丟棄。所以你基本上將OUTER JOIN轉換爲INNER JOIN。將該比較移至JOIN語句以保留OUTER JOIN。

更新:

務必從tblusers搶用戶名,因爲tblleaverequest.lqUser值可能爲空,由於OUTER JOIN。

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

Leigh,你對用戶名的「預測」變成了現實..我通過@Alex對我的查詢進行了更改,但是變得空白用戶......現在工作正常。謝謝x10! – jlig

+0

很高興幫助。剛剛測試過,顯然MySQL正常處理空日期,即不會拋出錯誤。還有一件事要擔心。 – Leigh

相關問題