오라클 구성비 구하는 쿼리 질문 2 514

by 물이~ [SQL Query] [2025.05.12 10:30:31]


안녕하세요. 

구성비 구하는 쿼리를 산출하기가 좀 쉽지않네요.

 

테이블 A 구조는 아래와 같으며 

브랜드 구분 금년실적 전년실적
나이키 신상품 50 45
나이키 이월상품 60 50
아디다스 신상품 30 25
아디다스 이월상품 70 60

이를 아래와 같은 쿼리 결과를 얻고자 합니다.

쿼리결과

브랜드 구분 금년실적 전년실적 금년구성비 전년구성비
총계 신상품 80 70 38.1 38.9
이월상품 130 110 61.9 61.1
소계 210 180 0 0
나이키 신상품 50 45 45.5 47.4
이월상품 60 50 54.5 52.6
소계 110 95 52.4 52.8
아디다스 신상품 30 25 30.0 29.4
이월상품 70 60 70.0 70.6
소계 100 85 47.6 47.2

나이키, 아디다스와 같은 브랜드별 소계에 대한 금년과 전년구성비는 해당 브랜드소계에 대한 구성비산출,

각 브랜드별 소계에 대한 구성비 산출은 전체 총계에 대한 브랜드별 구성비를 산출하여야하며

마지막으로 총계항목에 대한 구성비는 총계에 대한 구분별 구성비가 산출되어야 합니다.

고수분들의 도움을 좀 얻고자 합니다.

감사합니다.

 

by 마농 [2025.05.12 14:40:52]
WITH t AS
(
SELECT '나이키' cd, '신상품' gb, 50 v1, 45 v2 FROM dual
UNION ALL SELECT '나이키'  , '이월상품', 60, 50 FROM dual
UNION ALL SELECT '아디다스', '신상품'  , 30, 25 FROM dual
UNION ALL SELECT '아디다스', '이월상품', 70, 60 FROM dual
)
SELECT NVL(cd, '총계') 브랜드
     , NVL(gb, '소계') 구분
     , SUM(v1) 금년실적
     , SUM(v2) 전년실적
     , ROUND(RATIO_TO_REPORT(SUM(v1)) OVER(PARTITION BY GROUPING_ID(cd, gb), DECODE(GROUPING(gb), 0, cd)) * 100, 1) 금년구성비
     , ROUND(RATIO_TO_REPORT(SUM(v2)) OVER(PARTITION BY GROUPING_ID(cd, gb), DECODE(GROUPING(gb), 0, cd)) * 100, 1) 전년구성비
  FROM t a
 GROUP BY CUBE(cd, gb)
 ORDER BY a.cd NULLS FIRST
        , a.gb NULLS LAST
;

 


by 물이~ [2025.05.12 16:16:04]

감사합니다.

덕분에 너무 간소하게 깔끔하게 쿼리를 작성하게 됐습니다.

한 수 배웠습니다. 좋은 하루 되세요.