用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));
答
你要么需要使用RIGHT JOIN
或切换在LEFT JOIN
表的顺序返回任何tblEvent
记录它们具有零计数。当您使用LEFT JOIN
时,它将从左表中选择所有匹配的行,这是允许在ON
条件中存在不匹配的右表。
另外,您需要将表中可能有缺失行的任何条件移动到ON
子句中。在WHERE
或HAVING
中测试它们会过滤掉这些行,因为当没有匹配时列全部为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
和别名辉煌 – Strawberry
@Strawberry我通常使用我的回答简短的别名,但在这种情况下,它是太容易了,剪切和粘贴他的查询,并重新安排它,所以我不想用别名替换所有的表名。 – Barmar
@Barmar,谢谢你的帮助。 –