Вы можете сделать Left Join
из таблицы Address
в таблицу benefits
, через таблицу pensioners
, используя соответствующие отношения. Левое объединение позволяет нам рассматривать Address
, даже если нет соответствующей записи benefits
ни для одного из его граждан.
Чтобы подсчитать общее количество граждан, мужчин и женщин, вам теперь нужно использовать COUNT(DISTINCT ID)
после объединения. Поскольку присоединение может создавать повторяющиеся строки, у гражданина может быть несколько преимуществ.
Кроме того, чтобы подсчитать «Прочие» льготы, мы должны убедиться, что benefit IS NOT NULL
и NOT IN ('SSS', 'Coco Life')
.
В многостоловых запросах рекомендуется использовать Псевдоним для ясности кода (удобочитаемости) и избежания неоднозначного поведения.
SELECT
c.Address,
COUNT(DISTINCT CASE WHEN c.Sex = 'Male' THEN c.ID END) AS male_cnt,
COUNT(DISTINCT CASE WHEN c.Sex = 'Female' THEN c.ID END) AS female_cnt,
COUNT(DISTINCT c.ID) AS total_citizen_cnt,
COUNT(CASE WHEN b.benefits = 'SSS' THEN 1 END) AS SSS_cnt,
COUNT(CASE WHEN b.benefits = 'Coco Life' THEN 1 END) AS Coco_Life_cnt,
COUNT(CASE WHEN b.benefits IS NOT NULL AND
b.benefits NOT IN ('SSS', 'Coco Life') THEN 1 END) AS Others_cnt
FROM citizen AS c
LEFT JOIN pensioners AS p
ON p.citizen_ID = c.ID
LEFT JOIN benefits AS b
ON b.ID = p.benefits_ID
GROUP BY c.Address