안녕하세요. 쿼리 기초같은데 표현법을 몰라 질문드립니다.
1. 데이터
지역 | 종류 | 구분 |
서울 | DT | 구분1 |
서울 | DT | 구분1 |
서울 | DT | 구분1 |
서울 | DT | 구분1 |
서울 | DT | 구분2 |
서울 | DT | 구분2 |
서울 | NB | 구분1 |
서울 | NB | 구분1 |
서울 | NB | 구분1 |
서울 | NB | 구분1 |
서울 | NB | 구분1 |
서울 | NB | 구분2 |
서울 | NB | 구분2 |
서울 | NB | 구분2 |
인천 | DT | 구분1 |
인천 | NB | 구분2 |
인천 | NB | 구분2 |
경기 | DT | 구분1 |
경기 | NB | 구분1 |
경기 | NB | 구분1 |
경기 | NB | 구분1 |
경기 | NB | 구분1 |
2. 원하는 결과 값
지역 | 구분 | DT | NB | 총합 |
서울 | 구분1 | 4 | 5 | 9 |
서울 | 구분2 | 2 | 3 | 5 |
인천 | 구분1 | 1 | 0 | 1 |
인천 | 구분2 | 0 | 2 | 3 |
경기 | 구분1 | 1 | 4 | 5 |
경기 | 구분2 | 0 | 0 | 0 |
3. 질문자가 작성한 쿼리
WITH 지역별종류구분 ("지역","종류","구분") AS ( SELECT '서울', 'DT', '구분1' FROM DUAL UNION ALL SELECT '서울', 'DT', '구분1' FROM DUAL UNION ALL SELECT '서울', 'DT', '구분1' FROM DUAL UNION ALL SELECT '서울', 'DT', '구분1' FROM DUAL UNION ALL SELECT '서울', 'DT', '구분2' FROM DUAL UNION ALL SELECT '서울', 'DT', '구분2' FROM DUAL UNION ALL SELECT '서울', 'NB', '구분1' FROM DUAL UNION ALL SELECT '서울', 'NB', '구분1' FROM DUAL UNION ALL SELECT '서울', 'NB', '구분1' FROM DUAL UNION ALL SELECT '서울', 'NB', '구분1' FROM DUAL UNION ALL SELECT '서울', 'NB', '구분1' FROM DUAL UNION ALL SELECT '서울', 'NB', '구분2' FROM DUAL UNION ALL SELECT '서울', 'NB', '구분2' FROM DUAL UNION ALL SELECT '서울', 'NB', '구분2' FROM DUAL UNION ALL SELECT '인천', 'DT', '구분1' FROM DUAL UNION ALL SELECT '인천', 'NB', '구분2' FROM DUAL UNION ALL SELECT '인천', 'NB', '구분2' FROM DUAL UNION ALL SELECT '경기', 'DT', '구분1' FROM DUAL UNION ALL SELECT '경기', 'NB', '구분1' FROM DUAL UNION ALL SELECT '경기', 'NB', '구분1' FROM DUAL UNION ALL SELECT '경기', 'NB', '구분1' FROM DUAL UNION ALL SELECT '경기', 'NB', '구분1' FROM DUAL ) SELECT 지역 ,구분 , CASE WHEN 구분 = '구분1' THEN DT구분1 WHEN 구분 = '구분2' THEN DT구분2 END AS "D/T" , CASE WHEN 구분 = '구분1' THEN NB구분1 WHEN 구분 = '구분2' THEN NB구분2 END AS "N/B" , CASE WHEN 구분 = '구분1' THEN DT구분1 + NB구분1 WHEN 구분 = '구분2' THEN DT구분2 + NB구분2 END AS "총합" FROM( SELECT 지역 ,구분 , COUNT(CASE WHEN 종류 = 'DT' AND 구분 = '구분1' THEN 1 END) AS DT구분1 , COUNT(CASE WHEN 종류 = 'NB' AND 구분 = '구분1' THEN 1 END) AS NB구분1 , COUNT(CASE WHEN 종류 IN ('DT', 'NB') AND 구분 = '구분1' THEN 1 END) AS 구분1전체 , COUNT(CASE WHEN 종류 = 'DT' AND 구분 = '구분2' THEN 1 END) AS DT구분2 , COUNT(CASE WHEN 종류 = 'NB' AND 구분 = '구분2' THEN 1 END) AS NB구분2 , COUNT(CASE WHEN 종류 IN ('DT', 'NB') AND 구분 = '구분2' THEN 1 END) AS 구분2전체 FROM 지역별종류구분 WHERE 1=1 GROUP BY 지역, 구분 ) ORDER BY 1,2 ;
4. 질문자 쿼리 결과
지역 | 구분 | DT | NB | 총합 |
서울 | 구분1 | 4 | 5 | 9 |
서울 | 구분2 | 2 | 3 | 5 |
인천 | 구분1 | 1 | 0 | 1 |
인천 | 구분2 | 0 | 2 | 3 |
경기 | 구분1 | 1 | 4 | 5 |
5. 질문
사이트=경기, 구분=구분2에 대한 데이터가 없어 group by시 조회가 없습니다.
nvl로 표현을 하려고 해도 경기, 구분2에 대한 값만 null 체크하여 표현 해야되는데 방법을 모르겠습니다.
위에 결과값 처럼 | 경기 | 구분2 | 0 | 0 | 0 | row를 추가 표현 하고 싶습니다.
감사합니다.
WITH 지역별종류구분(지역, 종류, 구분) AS ( SELECT '서울', 'DT', '구분1' FROM dual UNION ALL SELECT '서울', 'DT', '구분1' FROM dual UNION ALL SELECT '서울', 'DT', '구분1' FROM dual UNION ALL SELECT '서울', 'DT', '구분1' FROM dual UNION ALL SELECT '서울', 'DT', '구분2' FROM dual UNION ALL SELECT '서울', 'DT', '구분2' FROM dual UNION ALL SELECT '서울', 'NB', '구분1' FROM dual UNION ALL SELECT '서울', 'NB', '구분1' FROM dual UNION ALL SELECT '서울', 'NB', '구분1' FROM dual UNION ALL SELECT '서울', 'NB', '구분1' FROM dual UNION ALL SELECT '서울', 'NB', '구분1' FROM dual UNION ALL SELECT '서울', 'NB', '구분2' FROM dual UNION ALL SELECT '서울', 'NB', '구분2' FROM dual UNION ALL SELECT '서울', 'NB', '구분2' FROM dual UNION ALL SELECT '인천', 'DT', '구분1' FROM dual UNION ALL SELECT '인천', 'NB', '구분2' FROM dual UNION ALL SELECT '인천', 'NB', '구분2' FROM dual UNION ALL SELECT '경기', 'DT', '구분1' FROM dual UNION ALL SELECT '경기', 'NB', '구분1' FROM dual UNION ALL SELECT '경기', 'NB', '구분1' FROM dual UNION ALL SELECT '경기', 'NB', '구분1' FROM dual UNION ALL SELECT '경기', 'NB', '구분1' FROM dual ) , 구분(구분) AS ( SELECT '구분1' FROM dual UNION ALL SELECT '구분2' FROM dual ) SELECT b.지역 , a.구분 , COUNT(CASE b.종류 WHEN 'DT' THEN 1 END) dt , COUNT(CASE b.종류 WHEN 'NB' THEN 1 END) nb , COUNT(b.종류) 총합 FROM 구분 a LEFT OUTER JOIN 지역별종류구분 b PARTITION BY (b.지역) ON a.구분 = b.구분 GROUP BY b.지역, a.구분 ;