합계와 백분율을 구하여 행을 열로 하는 쿼리 질문드려요 0 4 1,101

by 오라클초보 [SQL Query] [2020.07.03 22:40:15]


20200703.PNG (17,159Bytes)

안녕하세요.

코드와 구분별로 count, 백분율을 구하여 결과1 하고 결과2와 같이 열로 표시를 하여야 합니다.

결과1의 백분율은 코드의 구분별 갯수 합계/코드 합계로 %을 구합니다.(5행 2열은 7/11=63%, 7행 3열은 2/5=40%)

결과2의 백분율은 코드의 구분별 갯수 합계/구분합계으로 %을 구합니다.(5행 3열은 3/7=43%, 7행 4열은 2/3=67%)

고수님들의 많은 도움 및 조언 부탁 드립니다~

 

by 춘 [2020.07.04 07:24:23]
WITH t AS
(
SELECT 'A' code, 1 gubun FROM dual
UNION ALL
SELECT 'A', 2 FROM dual
UNION ALL
SELECT 'B', 2 FROM dual
UNION ALL
SELECT 'A', 1 FROM dual
UNION ALL
SELECT 'B', 1 FROM dual
UNION ALL
SELECT 'A', 3 FROM dual
UNION ALL
SELECT 'C', 1 FROM dual
UNION ALL
SELECT 'B', 1 FROM dual
UNION ALL
SELECT 'A', 2 FROM dual
UNION ALL
SELECT 'C', 1 FROM dual
UNION ALL
SELECT 'D', 1 FROM dual
)
SELECT DISTINCT
    gubun AS "구분"
    , SUM(cnt) AS "계"
    , SUM(code_a) AS code_a
    , SUM(code_b) AS code_b
    , SUM(code_c) AS code_c
    , SUM(code_d) AS code_d
FROM
    (
    SELECT
        gubun
        , COUNT(*) AS cnt
        , COUNT(DECODE(code, 'A', code)) AS code_a
        , COUNT(DECODE(code, 'B', code)) AS code_b
        , COUNT(DECODE(code, 'C', code)) AS code_c
        , COUNT(DECODE(code, 'D', code)) AS code_d
    FROM t
    GROUP BY gubun
    )
GROUP BY ROLLUP(gubun)
ORDER BY gubun NULLS FIRST
;

퍼센트가 뭘 의미하는지 이해되지 않네요...
이 쿼리를 참조하셔서 수정하시거나,
다른 분의 쿼리를 참조하셔야 할 것 같네요...

 


by 오라클초보 [2020.07.07 20:51:27]

답변 감사 합니다.


by 마농 [2020.07.06 08:24:46]
WITH t AS
(
SELECT 'A' cd, '1' gb FROM dual
UNION ALL SELECT 'A', '2' FROM dual
UNION ALL SELECT 'B', '2' FROM dual
UNION ALL SELECT 'A', '1' FROM dual
UNION ALL SELECT 'B', '1' FROM dual
UNION ALL SELECT 'A', '3' FROM dual
UNION ALL SELECT 'C', '1' FROM dual
UNION ALL SELECT 'B', '1' FROM dual
UNION ALL SELECT 'A', '2' FROM dual
UNION ALL SELECT 'C', '1' FROM dual
UNION ALL SELECT 'D', '1' FROM dual
)
SELECT *
  FROM (SELECT NVL(gb, '합계') 구분1
             , NVL(cd, '계') cd
             , COUNT(*) || '' 건수
             , ROUND(
               RATIO_TO_REPORT(COUNT(*)) OVER(
               --PARTITION BY GROUPING_ID(gb, cd), NVL2(gb, cd, gb)  -- 결과1
                 PARTITION BY GROUPING_ID(gb, cd), gb                -- 결과2
               ) * 100) || '%' 비율
          FROM t
         GROUP BY CUBE(gb, cd)
        )
 UNPIVOT (v FOR 구분2 IN (건수, 비율))
   PIVOT (MIN(v) FOR cd IN ('계' 계, 'A' a, 'B' b, 'C' c, 'D' d))
 ORDER BY DECODE(구분1, '합계', '0', 구분1), 구분2
;

 


by 오라클초보 [2020.07.07 20:50:58]

많은 도움이 되었습니다. 감사합니다.

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