통계 쿼리 하나 질문 드릴께요 0 4 1,211

by 탑개발자 [SQL Query] [2013.12.06 13:03:53]



테이블은 CARRIERID , PROVISIONDATE , CHANGEDATE , TERMINATIONDATE 등 여러 컬럼이 있습니다.
CARRIERID - 통신사
PROVISIONDATE  - 개통일자
CHANGEDATE   - 변경일자
TERMINATIONDATE - 해지 일자

위에 4가지가 일단 중요한 필드 입니다.  제가 원하는 값은
통신사별로 분류 그것을 개통,변경 ,해지 이렇게 날짜가 있는지 없는지 체크 해서 카운트를 내는 겁니다. 카운트는 기준은 해지일자가 있으면 그 항목은 해지 카운트를 세고 변경이나 개통카운트는 올리지 않습니다. 해지가 null 이고 변경이 있으면 변경 카운트가 올라가고요 해지 null, 이고 변경도 null 이면 개통일자가 있는지 체크 해서 카운트 올리고요 이런식으로 구현 하고 싶습니다 .

화면 뷰는
  서비스별 회선서비스
사업자별   신규 변경 해지
KT  1  0  0  1
LGU+  1  1  1  3
SK  1  0  1  2
SKB  1  1  1  3
 4  2  3  9


이런 식에 화면이 나오는 거 입니다.
쿼리좀 부탁 드립니다.
by 마농 [2013.12.06 13:30:59]
WITH t AS
(
SELECT 'KT' carrierid, '12/01' provisiondate, '' changedate, '' terminationdate FROM dual
UNION ALL SELECT 'LGU+', '12/01', ''     , ''      FROM dual
UNION ALL SELECT 'LGU+', '12/01', '12/02', ''      FROM dual
UNION ALL SELECT 'LGU+', '12/01', '12/02', '12/03' FROM dual
UNION ALL SELECT 'SK'  , '12/01', ''     , ''      FROM dual
UNION ALL SELECT 'SK'  , '12/01', ''     , '12/02' FROM dual
UNION ALL SELECT 'SKB' , '12/01', ''     , ''      FROM dual
UNION ALL SELECT 'SKB' , '12/01', '12/02', ''      FROM dual
UNION ALL SELECT 'SKB' , '12/01', '12/02', '12/03' FROM dual
)
SELECT carrierid
     , NVL(SUM(DECODE(gb, 1, cnt)), 0) 신규
     , NVL(SUM(DECODE(gb, 2, cnt)), 0) 변경
     , NVL(SUM(DECODE(gb, 3, cnt)), 0) 해지
     , SUM(cnt) 계
  FROM (SELECT carrierid
             , DECODE('', terminationdate, DECODE('', changedate, 1, 2), 3) gb
             , COUNT(*) cnt
          FROM t
         GROUP BY carrierid
             , DECODE('', terminationdate, DECODE('', changedate, 1, 2), 3)
        )
 GROUP BY ROLLUP(carrierid)
;

by 탑개발자 [2013.12.06 14:29:06]
답변감사드립니다.

by 우리집아찌 [2013.12.06 13:44:20]
WITH T (CARRIERID ,PROVISIONDATE, CHANGEDATE ,TERMINATIONDATE) AS ( 
SELECT 'KT' ,'20130101','','20130101' FROM DUAL UNION ALL
SELECT 'KT' ,'20130101','20130101','' FROM DUAL UNION ALL
SELECT 'LGU+','20130101','','' FROM DUAL UNION ALL
SELECT 'LGU+','20130101','','' FROM DUAL UNION ALL
SELECT 'SK' ,'20130101','','' FROM DUAL UNION ALL
SELECT 'SKB' ,'20130101','20130101','20130101' FROM DUAL 
) 


SELECT CARRIERID , SUM(신규) 신규 , SUM(변경) 변경 , SUM(해지) 해지 , SUM(계) 계
 FROM
(SELECT CARRIERID , 
  COUNT(CASE WHEN CHANGEDATE IS NULL AND TERMINATIONDATE IS NULL THEN 1 END) 신규, 
  COUNT(CASE WHEN CHANGEDATE IS NOT NULL AND TERMINATIONDATE IS NULL THEN 1 END) 변경 , 
  COUNT(CASE WHEN TERMINATIONDATE IS NOT NULL THEN 1 END) 해지 , 
  COUNT(*) 계 
 FROM T 
 GROUP BY CARRIERID )
 GROUP BY ROLLUP (( CARRIERID , 신규 , 변경 , 해지 , 계)) 

by 탑개발자 [2013.12.06 14:28:52]
답변감사드립니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입