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 

출력은 total,male,female에서 0 값이 중복 purok 제거 할, 괜찮습니다.

output of the query above

다음은 화상에 빨간 위에서 제거되어야 표시했다.

+1

유니언은 개별 키가 아닌 행을 고유하게 만듭니다. 귀하의 경우 두 개의 서로 다른 행 ('01, 2, 2, 0'과'01, 0, 0, 0')이 있으므로 'UNION'은 두 행을 모두 유지합니다. – dasblinkenlight

+0

그래서, 대신 JOIN? –

+2

'JOIN'은 작동 할 수 있지만 작동시키기 위해 필요한 CASE 문은 복잡해집니다. 아마도 테이블 수준에서'UNION ALL'을 사용하고,'purok'에 대한 큰'GROUP BY' 쿼리로 감쌀 수 있습니다. – dasblinkenlight

답변

2

연합은 개별 키가 아닌 행을 고유하게 만듭니다. 귀하의 경우 두 개의 서로 다른 행 (01, 2, 2, 001, 0, 0, 0)이 있으므로 UNION 두 개를 모두 유지합니다. 쿼리에 tbl_answertbl_household에 가입하지 않는, 그래서 자리 조인 조건을 "발명"

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 

참고 :

당신은 아마 UNION ALL 테이블 수준에서, purok에 큰 GROUP BY 쿼리에서 그것을 포장 할 수 h.householdid=a.householdid. 실제 조인 기준으로 대체해야합니다.