Я бы начал с предварительного запроса tableB, сгруппированного по столбцу tableA ID. Теперь go вернемся к исходной таблице A и перейдем с LEFT-JOIN к tableB.
select
A.*,
coalesce( BQry.bRecs, 0 ) as NumBRecords
from
tableA A
LEFT JOIN
( select
tableaID,
count(*) bRecs
from
tableB
group by
tableaID ) BQry
on A.id = BQry.tableaID
Теперь сторона таблицы "A" имеет идентификатор, который, как я подозреваю, является первичным ключом и никогда не будет иметь любые дубликаты "ID" в этой таблице. Таким образом, группировка внутренней таблицы «BQry» по этому идентификатору является основой объединения, как и ваше левое соединение. Сторона «А» всегда будет равна 1, поскольку это основа записи запроса.
Coalesce () для записей BQry будет равен 0, если такого совпадения для tableAID нет, и фактическим числом, если таковое найдено.
И в будущем не пытайтесь расширять ответ в комментарии ... Просто отредактируйте свой существующий пост и добавьте к нему дополнительную информацию.
ПЕРЕСМОТР
После повторного просмотра я обнаружил, что вы не определяете внешнюю сумму на tableA ID, но имя в TableID. Несколько табличных идентификаторов могут иметь одинаковые ссылки на имена.
select
A.NameID,
A.Area,
count(*) as NameCounts,
sum( coalesce( BQry.bRecs, 0 )) as NumBRecords
from
tableA A
LEFT JOIN
( select
tableaID,
count(*) bRecs
from
tableB
group by
tableaID ) BQry
on A.id = BQry.tableaID
группа по A.NameID, A.Area