2017-06-04 98 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,谢谢你的帮助。 –