Показать значения, которых нет в другой таблице

У меня есть это tbl_religion с именем поля creldesc

введите описание изображения здесь

и tbl_member с этими полями
введите описание изображения здесь

и у меня есть этот запрос для подсчета всех существующих религий в tbl_member и подсчета также нет. мужчины и женщины с этой религией, поэтому я сделал этот запрос:

    SELECT m.creldesc as type,
COUNT(m.creldesc) as total,
SUM(CASE WHEN m.cgender='Male' THEN 1 ELSE 0 END) as male,
SUM(CASE WHEN m.cgender='Female' THEN 1 ELSE 0 END) as female
FROM tbl_member as m, tbl_barangay as b, tbl_household as h
WHERE m.chholdnumber = h.chholdnumber and h.cbrgycode=b.cbrgycode and b.cbrgyname = 'AGAO'
and m.crelationdesc !='Brgy. Captain'
GROUP BY m.creldesc
ORDER BY tot DESC;

и получить этот вывод:

введите описание изображения здесь

я хочу также отобразить оставшуюся религию из tbl_religion со значением 0 в качестве значения. Я сделал левое соединение, но получил ошибку. Может ли кто-нибудь помочь мне, как я могу достичь этого?

   type          total    male    female
Roman Catholic     7       4        3
Baptist            3       1        2
Islam              3       3        0
Iglesia ni Cristo  1       1        0
Free Methodist     1       1        0
Ang Dating Daan    1       0        1
Aglipay/Filipinsta 0       0        0
All the Gospel     0       0        0
Alpha Omega        0       0        0
and so on.............................

0

Решение

Используйте одинаковый подход к объединению для всех таблиц, например так:

SELECT m.creldesc as type, COUNT(m.creldesc) as tot,
SUM(CASE WHEN m.cgender='Male' THEN 1 ELSE 0 END) as male,
SUM(CASE WHEN m.cgender='Female' THEN 1 ELSE 0 END) as female
FROM tbl_religion
LEFT JOIN tbl_member as m
ON tbl_religion.creldesc=m.creldesc
LEFT JOIN tbl_household as h
ON m.chholdnumber = h.chholdnumber
LEFT JOIN tbl_barangay as b
ON h.cbrgycode=b.cbrgycode
WHERE b.cbrgyname = 'AGAO' AND m.crelationdesc !='Brgy. Captain'
GROUP BY m.creldesc
ORDER BY tot DESC

Ваш текущий подход к запросу ... FROM tbl_member, tbl_barangay, tbl_household LEFT JOIN tbl_religion ... неправильно и приведет к синтаксической ошибке.

0

Другие решения

Вы не можете сделать это:

ОТ @ TABLE1, @ TABLE2, @ TABLE3
LEFT JOIN @ TABLE0 ON …

Вы можете выбрать элементы только из таблицы одновременно … то же самое для объединения.

SELECT m.creldesc as type,
COUNT(m.creldesc) as tot,
SUM(CASE WHEN m.cgender='Male' THEN 1 ELSE 0 END) as male,
SUM(CASE WHEN m.cgender='Female' THEN 1 ELSE 0 END) as female
FROM tbl_member as m

LEFT JOIN tbl_religion z ON z.creldesc = m.creldesc
LEFT JOIN tbl_barangay h ON h.cbrgycode=b.cbrgycode

SO ON.... WITH JOINS
GROUP BY m.creldesc

ОБНОВЛЕНИЕ КОДА РАБОТЫ:

SELECT m.creldesc as type, COUNT(m.creldesc) as tot, SUM(CASE WHEN m.cgender='Male' THEN 1 ELSE 0 END) as male,
SUM(CASE WHEN m.cgender='Female' THEN 1 ELSE 0 END) as female

FROM tbl_member as m
LEFT JOIN tbl_religion r ON r.creldesc = m.creldesc
LEFT JOIN tbl_barangay as b ON m.chholdnumber = b.cbrgycode
LEFT JOIN tbl_household as h  ON h.cbrgycode = b.cbrgycode

WHERE b.cbrgyname = 'AGAO' and m.crelationdesc !='Brgy. Captain'
GROUP BY m.creldesc
ORDER BY tot DESC
0

Вот что я сделал:

        SELECT tbl_member.creldesc AS type,
COUNT(tbl_member.creldesc) AS total,
SUM(CASE WHEN tbl_member.cgender::text = 'Male'::text THEN 1 ELSE 0 END) AS male,
SUM(CASE WHEN tbl_member.cgender::text = 'Female'::text THEN 1 ELSE 0 END) AS female
FROM tbl_member
GROUP BY tbl_member.creldesc

UNION

SELECT b.creldesc AS type, 0 AS total, 0 AS male, 0 AS female
FROM tbl_religion b
WHERE NOT (b.creldesc::text IN
( SELECT DISTINCT tbl_member.creldesc FROM tbl_member))
GROUP BY b.creldesc;

и вот это вывод:

введите описание изображения здесь

вот и все 🙂 Я использовал UNION вместо LEFT JOIN.

0
По вопросам рекламы [email protected]