안녕하세요.
구성비 구하는 쿼리를 산출하기가 좀 쉽지않네요.
테이블 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 |
나이키, 아디다스와 같은 브랜드별 소계에 대한 금년과 전년구성비는 해당 브랜드소계에 대한 구성비산출,
각 브랜드별 소계에 대한 구성비 산출은 전체 총계에 대한 브랜드별 구성비를 산출하여야하며
마지막으로 총계항목에 대한 구성비는 총계에 대한 구분별 구성비가 산출되어야 합니다.
고수분들의 도움을 좀 얻고자 합니다.
감사합니다.
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
;
감사합니다.
덕분에 너무 간소하게 깔끔하게 쿼리를 작성하게 됐습니다.
한 수 배웠습니다. 좋은 하루 되세요.