group by시 데이터가 없을 경우 쿼리 0 1 1,114

by 밤톨이 [SQL Query] [2021.01.05 10:16:27]


안녕하세요. 쿼리 기초같은데 표현법을 몰라 질문드립니다.

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를 추가 표현 하고 싶습니다.

 

감사합니다.

by 마농 [2021.01.05 12:31:37]
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.구분
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입