Try that query without the count(b). I think it's that that's ruining things for you. It's essentially adding in the requirement that b is not null, nullifying the effect of the left join. You may be able to get what you want with this query:
Code:
select count(q), count(q.BookingSet.id)
from Quote q where q.CreateDate =?
That exploits the fact that <association>.id is not joined, it uses the foreign key value in the base table. I'm not sure that that'll work: if it doesn't, you may have to go with the cross-join:
Code:
select count(q), count(b)
from Quote q, BookingSet b
where q.CreateDate =?
and (q.BookingSet is empty or q.BookingSet = b)