database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 40380 게시물 읽기
No. 40380
ROLLUP을 사용해야 되는데 DECODE를 써야 되는 부분이 있어서 질문합니다.
작성자
소라
작성일
2014-02-12 19:34
조회수
7,512

1. 질문

제가 조회하고자 하는 쿼리 결과는 TOT_CNT 중 TOT_DSAFN_CNT의 비율이 일자별로 나타나고,  INQ_L_CODE, INQ_M_CODE, INQ_CODE별로 소계가 나타나야 됩니다.

일자에 상관없이 비율은 나오게 했는데, 우측으로 일자별로 나타나게 하기 위해 DECODE를 사용하려고 하는데 문제가 됩니다.

비율의 소계를 구하기 위해서는 SUM을 먼저 한 다음 나눠줘야 정확한 값이 나오고, 먼저 나눈 다음 SUM한 결과는 정확한 결과가 아닙니다.

SUM(TOT_DSAFN_CNT)/SUM(TOT_CNT) = O

SUM(TOT_DSAFN_CNT/TOT_CNT) = X

그런데 DECODE문으로 INQ_DT 일자에 따라 보여줄 때 ... 어떻게 해야 오류가 안 날지 모르겠습니다;;

 

2. 쿼리
WITH INQ_TB AS (
    SELECT '20140210' AS INQ_DT, 'A2111' AS INQ_CODE, 'A' AS INQ_L_CODE, 'A2' AS INQ_M_CODE, 15 AS TOT_CNT, 3 AS TOT_DSAFN_CNT FROM DUAL
    UNION ALL SELECT '20140209', 'B5137', 'B', 'B5', 12,    3 FROM DUAL
    UNION ALL SELECT '20140210', 'A2111', 'A', 'A2', 12,    3 FROM DUAL
    UNION ALL SELECT '20140210', 'B3126', 'B', 'B3', 14,    4 FROM DUAL
    UNION ALL SELECT '20140211', 'B3125', 'B', 'B3', 11,    3 FROM DUAL
    UNION ALL SELECT '20140207', 'A2111', 'A', 'A2',  5,    1 FROM DUAL
)
SELECT INQ_L_CODE
     , INQ_M_CODE
     , INQ_CODE
     , SUM(TOT_CNT) AS TOT_CNT
     , SUM(TOT_DSAFN_CNT) AS TOT_DSAFN_CNT
     , ROUND((SUM(TOT_DSAFN_CNT)/SUM(TOT_CNT))*100,1) AS TOT_DSAFN_RT
  FROM INQ_TB
 GROUP BY ROLLUP(INQ_L_CODE, INQ_M_CODE, INQ_CODE)

 

3. 원하는 결과. 노란색으로 칠해진 부분이 일자입니다. 해당하는 일자의 비율이 나타나게 쿼리 부탁드립니다.

INQ_L_CODE INQ_M_CODE INQ_CODE TOT_CNT TOT_DSAFN_CNT TOT_DSAFN_RT 01 02 03 04 05 06 07 08 09 10 11 12
A A2 A2111 32 7 21.90%                        
A A2 소계 32 7 21.90%                        
A 소계   32 7 21.90%                        
B B31 B3125 11 3 27.30%                        
B B31 B3126 14 4 28.60%                        
B B31 소계 25 7 28%                        
B B51 B5137 12 3 25%                        
B B51 소계 12 3 25%                        
B 소계   37 10 27%                        
합계     69 17 24.60%                        

 

 

 

 

이 글에 대한 댓글이 총 1건 있습니다.

WITH INQ_TB AS (
    SELECT '20140210' AS INQ_DT
         , 'A2111' AS INQ_CODE, 'A' AS INQ_L_CODE, 'A2' AS INQ_M_CODE, 15 AS TOT_CNT, 3 AS TOT_DSAFN_CNT FROM DUAL
    UNION ALL SELECT '20140209', 'B5137', 'B', 'B5', 12,    3 FROM DUAL
    UNION ALL SELECT '20140210', 'A2111', 'A', 'A2', 12,    3 FROM DUAL
    UNION ALL SELECT '20140210', 'B3126', 'B', 'B3', 14,    4 FROM DUAL
    UNION ALL SELECT '20140211', 'B3125', 'B', 'B3', 11,    3 FROM DUAL
    UNION ALL SELECT '20140207', 'A2111', 'A', 'A2',  5,    1 FROM DUAL
)

SELECT INQ_L_CODE
     , INQ_M_CODE
     , INQ_CODE
     , SUM(TOT_CNT) AS TOT_CNT
     , SUM(TOT_DSAFN_CNT) AS TOT_DSAFN_CNT
     , ROUND((SUM(TOT_DSAFN_CNT)/SUM(TOT_CNT))*100,1) AS TOT_DSAFN_RT
     , MAX(M01) AS M01
     , MAX(M02) AS M02
     , MAX(M03) AS M03
     , MAX(M04) AS M04
     , MAX(M05) AS M05
     , MAX(M06) AS M06
     , MAX(M07) AS M07
     , MAX(M08) AS M08
     , MAX(M09) AS M09
     , MAX(M10) AS M10
     , MAX(M11) AS M11
     , MAX(M12) AS M12
    
FROM (
        SELECT INQ_L_CODE
             , INQ_M_CODE
             , INQ_CODE
             , SUM(TOT_CNT) AS TOT_CNT
             , SUM(TOT_DSAFN_CNT) AS TOT_DSAFN_CNT
             , ROUND((SUM(TOT_DSAFN_CNT)/SUM(TOT_CNT))*100,1) AS TOT_DSAFN_RT
             , case when substr(INQ_DT,7,2) = '01' then ROUND((SUM(TOT_DSAFN_CNT)/SUM(TOT_CNT))*100,1) else 0 end as M01
             , case when substr(INQ_DT,7,2) = '02' then ROUND((SUM(TOT_DSAFN_CNT)/SUM(TOT_CNT))*100,1) else 0 end as M02
             , case when substr(INQ_DT,7,2) = '03' then ROUND((SUM(TOT_DSAFN_CNT)/SUM(TOT_CNT))*100,1) else 0 end as M03
             , case when substr(INQ_DT,7,2) = '04' then ROUND((SUM(TOT_DSAFN_CNT)/SUM(TOT_CNT))*100,1) else 0 end as M04
             , case when substr(INQ_DT,7,2) = '05' then ROUND((SUM(TOT_DSAFN_CNT)/SUM(TOT_CNT))*100,1) else 0 end as M05
             , case when substr(INQ_DT,7,2) = '06' then ROUND((SUM(TOT_DSAFN_CNT)/SUM(TOT_CNT))*100,1) else 0 end as M06
             , case when substr(INQ_DT,7,2) = '07' then ROUND((SUM(TOT_DSAFN_CNT)/SUM(TOT_CNT))*100,1) else 0 end as M07
             , case when substr(INQ_DT,7,2) = '08' then ROUND((SUM(TOT_DSAFN_CNT)/SUM(TOT_CNT))*100,1) else 0 end as M08
             , case when substr(INQ_DT,7,2) = '09' then ROUND((SUM(TOT_DSAFN_CNT)/SUM(TOT_CNT))*100,1) else 0 end as M09
             , case when substr(INQ_DT,7,2) = '10' then ROUND((SUM(TOT_DSAFN_CNT)/SUM(TOT_CNT))*100,1) else 0 end as M10
             , case when substr(INQ_DT,7,2) = '11' then ROUND((SUM(TOT_DSAFN_CNT)/SUM(TOT_CNT))*100,1) else 0 end as M11
             , case when substr(INQ_DT,7,2) = '12' then ROUND((SUM(TOT_DSAFN_CNT)/SUM(TOT_CNT))*100,1) else 0 end as M12
          FROM INQ_TB
        GROUP BY INQ_L_CODE, INQ_M_CODE, INQ_CODE,INQ_DT
)

 GROUP BY ROLLUP(INQ_L_CODE, INQ_M_CODE, INQ_CODE)
;

 

이요한(dlgusxor)님이 2014-02-14 09:47에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40383함수 질문이여 [1]
김도완
2014-02-14
6905
40382조회조건 [01,02] 와 전체조회[null] 계산법이 다른데 전체조회시 코드값[01,02]계산을 따로 하는방법 부탁드려요 [1]
초록이
2014-02-13
7647
40381SQL문 질문입니다. [1]
장중철
2014-02-13
6616
40380ROLLUP을 사용해야 되는데 DECODE를 써야 되는 부분이 있어서 질문합니다. [1]
소라
2014-02-12
7512
40379특정조건별 그룹번호 부여가능한가요? [2]
엘군
2014-02-12
6491
40377이전 데이터와 자료 비교 [2]
성석준
2014-02-12
7312
40376기간내 값 검색 후 요일별 정렬에 대하여 여쭤봅니다. [2]
송영환
2014-02-12
6307
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다