2017-06-04 123 views
0

試圖通過使用tblEmployeeBooking上的計數函數返回已被預訂來處理特定事件的工作人員數;該值將用於比較tblEvent所需的員工人數。用0計數返回行

目前,下面的語句不中tblEmployeeBooking

SELECT e.eventID 
    , e.staffQuantity 
    , Count(b.eventID) AS CountOfeventID 
    FROM tblEmployeeBooking b 
    LEFT 
    JOIN tblEvent e 
    ON b.eventID = e.eventID 
GROUP 
    BY e.eventID 
    , e.staffQuantity 
    , b.cancelled 
HAVING (((b.cancelled)=0)); 

回答

1

你要麼需要使用RIGHT JOIN或切換在LEFT JOIN表的順序返回任何tblEvent記錄它們具有零計數。當您使用LEFT JOIN時,它將從左表中選擇所有匹配的行,這是允許在ON條件中存在不匹配的右表。

另外,您需要將表中可能有缺失行的任何條件移動到ON子句中。在WHEREHAVING中測試它們會過濾掉這些行,因爲當沒有匹配時列全部爲NULL,而不是= 0

而且你不應該使用GROUP BY子表中的任何列,因爲當沒有匹配時,這些列將全部爲NULL,並且它們將組合在一起。在這種情況下,按tblEmployeeBooking.cancelled進行分組沒有意義,因爲您只選擇cancelled = 0的行,因此無論如何它們都將處於同一組中。

所以它應該是:

SELECT tblEvent.eventID, tblEvent.staffQuantity, Count(tblEmployeeBooking.eventID) AS CountOfeventID 
FROM tblEvent 
LEFT JOIN tblEmployeeBooking ON tblEmployeeBooking.eventID = tblEvent.eventID AND tblEmployeeBooking.cancelled = 0 
GROUP BY tblEvent.eventID, tblEvent.staffQuantity 
+0

和別名輝煌 – Strawberry

+0

@Strawberry我通常使用我的回答簡短的別名,但在這種情況下,它是太容易了,剪切和粘貼他的查詢,並重新安排它,所以我不想用別名替換所有的表名。 – Barmar

+0

@Barmar,謝謝你的幫助。 –