2014-10-15 2 views
1

У меня есть этот запрос ниже, и у меня возникли проблемы с использованием UNION, он дублирует purok.Дублирующие значения с использованием UNION

SELECT h.cpurok as purok, 
COUNT(m.cgender) AS total, 
SUM(CASE WHEN m.cgender::text = 'Male'::text THEN 1 ELSE 0 END) AS male, 
SUM(CASE WHEN m.cgender::text = 'Female'::text THEN 1 ELSE 0 END) AS female 
FROM tbl_member as m, tbl_household as h, tbl_barangay as b, tbl_answer as a 
WHERE h.chholdnumber=m.chholdnumber 
and h.cbrgycode=b.cbrgycode 
and b.cbrgyname='AGAO' 
and a.nqid=16 
and a.nmemberid=m.nmemberid 
and choice in ('29','30','31','32','35','36') 
GROUP BY purok 
UNION 
SELECT h.cpurok as purok, 
0 AS total, 0 AS male, 0 AS female 
FROM tbl_household as h, tbl_answer as a 
WHERE a.nqid=15 
and choice='21' 
order by purok 

Выход нормально, просто хочу, чтобы удалить дублируется purok который имеет 0 значения в total,male,female.

output of the query above

отмеченных красным цветом на изображении выше, должны быть удалены.

+1

Union делает строки, а не отдельные ключи, уникальными. В вашем случае у вас есть две разные строки - '01, 2, 2, 0' и' 01, 0, 0, 0', поэтому 'UNION' сохраняет их оба. – dasblinkenlight

+0

Итак, ПРИСОЕДИНЯЙТЕСЬ? –

+2

'JOIN' может работать, но утверждение' CASE', которое вам нужно будет сделать, будет затруднено. Вы могли бы, вероятно, «UNION ALL» на уровне таблицы, обернуть это в большой запрос GROUP BY на 'purok'. – dasblinkenlight

ответ

2

Union делает строки, а не отдельные ключи, уникальными. В вашем случае у вас есть два разных ряда: 01, 2, 2, 0 и 01, 0, 0, 0, поэтому UNION хранит их оба.

Вы могли бы UNION ALL на уровне таблицы, завернуть, что в большом GROUP BY запросе на purok:

SELECT purok, 
SUM(num) AS total, 
SUM(male) AS male, 
SUM(female) AS female 
FROM (

    SELECT 
     h.cpurok AS 
    , 1 AS num 
    , CASE WHEN m.cgender::text = 'Male'::text THEN 1 ELSE 0 END AS male 
    , CASE WHEN m.cgender::text = 'Female'::text THEN 1 ELSE 0 END AS female 
    FROM tbl_member as m 
    JOIN tbl_household as h ON h.chholdnumber=m.chholdnumber 
    JOIN tbl_barangay as b ON h.cbrgycode=b.cbrgycode AND b.cbrgyname='AGAO' 
    JOIN tbl_answer as a ON a.nmemberid=m.nmemberid AND a.nqid=16 
    WHERE choice in ('29','30','31','32','35','36') 

    UNION ALL 

    SELECT h.cpurok as purok, 
    0 AS num, 0 AS male, 0 AS female 
    FROM tbl_household as h 
    JOIN tbl_answer as a ON h.householdid=a.householdid AND a.nqid=15 
    WHERE choice='21' 
) raw 
GROUP BY purok 
ORDER BY purok 

Примечания: Ваш запрос не присоединиться tbl_household к tbl_answer, так что я «изобрел» заполнитель условия соединения h.householdid=a.householdid. Вы должны заменить его фактическим критерием соединения.

Смежные вопросы