안녕하세요 ~
table_A
rownum 과일 채소
1 사과 당근
2 사과 양파
3 딸기 당근
4 사과 양파
5 수박 당근
과일은 사과 3개, 딸기 1개, 수박 1개
야채는 당근 3개, 양파 2개 이렇게 있는데요
목표는 과일이 5개중 사과가 3개라서 60%
채소는 5개중 당근이 3개라서 60%
가장많이 들어간것의 퍼센테이지를 구하는것인데
쿼리로 가능할까요?
WITH table_A AS ( SELECT '사과' 과일, '당근' 채소 FROM dual UNION ALL SELECT '사과', '양파' FROM dual UNION ALL SELECT '딸기', '당근' FROM dual UNION ALL SELECT '사과', '양파' FROM dual UNION ALL SELECT '수박', '당근' FROM dual ) SELECT 구분, 품목 , 갯수, 비율 FROM ( SELECT NVL2(과일, '과일', '채소') 구분 , NVL(과일, 채소) 품목 , COUNT(*) 갯수 , RATIO_TO_REPORT(COUNT(*)) OVER(PARTITION BY GROUPING(과일)) * 100 비율 , RANK() OVER(PARTITION BY GROUPING(과일) ORDER BY COUNT(*) DESC) rk FROM table_a GROUP BY GROUPING SETS (과일, 채소) ) WHERE rk = 1 ;
오우 마농님 감사합니다.
대단하십니당~~ 와우와우
그런데 과일, 채소 두개일땐 되는데 제가 하는것은 과자, 해산물, 등등 6개정도가 되서
적용하니까 안되네요...
NVL2 랑
NVL 에 매개변수 숫자때문에요
이런문제가 생길줄이야
연구해보겠습니다. 쿼리문 고맙습니다.
하긴햇는데 너무 무식하네요 -_-;;
WITH table_A AS ( SELECT '사과' 과일, '당근' 채소, '새우깡' 과자 FROM dual UNION ALL SELECT '사과', '양파', '새우깡' FROM dual UNION ALL SELECT '딸기', '당근', '자갈치' FROM dual UNION ALL SELECT '사과', '양파', '자갈치' FROM dual UNION ALL SELECT '수박', '당근', '자갈치' FROM dual UNION ALL SELECT '수박', '양파', '자갈치' FROM dual ) SELECT 구분, 품목, 갯수 ,CASE WHEN 과일_비율 > 채소_비율 AND 과일_비율 > 과자_비율 THEN 과일_비율 WHEN 채소_비율 > 과일_비율 AND 채소_비율 > 과자_비율 THEN 채소_비율 WHEN 과자_비율 > 과일_비율 AND 과자_비율 > 채소_비율 THEN 과자_비율 END AS 비율 FROM ( SELECT NVL2(과일, '과일', CASE WHEN 채소 IS NOT NULL THEN '채소' ELSE (CASE WHEN 과자 IS NOT NULL THEN '과자' END)END) AS 구분 ,NVL(과일, CASE WHEN 채소 IS NOT NULL THEN 채소 ELSE (CASE WHEN 과자 IS NOT NULL THEN 과자 END)END) AS 품목 ,COUNT(*) AS 갯수 ,ROUND(RATIO_TO_REPORT(COUNT(*)) OVER(PARTITION BY GROUPING(과일)) * 100, 2) AS 과일_비율 ,ROUND(RATIO_TO_REPORT(COUNT(*)) OVER(PARTITION BY GROUPING(채소)) * 100, 2) AS 채소_비율 ,ROUND(RATIO_TO_REPORT(COUNT(*)) OVER(PARTITION BY GROUPING(과자)) * 100, 2) AS 과자_비율 ,DENSE_RANK() OVER(PARTITION BY GROUPING (과일) ORDER BY COUNT(*) DESC) 과일_RK ,DENSE_RANK() OVER(PARTITION BY GROUPING (채소) ORDER BY COUNT(*) DESC) 채소_RK ,DENSE_RANK() OVER(PARTITION BY GROUPING (과자) ORDER BY COUNT(*) DESC) 과자_RK FROM table_a GROUP BY GROUPING SETS (과일, 채소, 과자) ) WHERE 과일_RK = 1 OR 채소_RK = 1 OR 과자_RK = 1 ;
-- 빨간색 표시부분만 적절히 조절하시면 되겠습니다.
SELECT lv , 구분, 품목 , 갯수, 비율 FROM ( SELECT lv , DECODE(lv, 1, '과일', 2, '채소', 3, '과자') 구분 , DECODE(lv, 1, 과일 , 2, 채소 , 3, 과자 ) 품목 , COUNT(*) 갯수 , RATIO_TO_REPORT(COUNT(*)) OVER(PARTITION BY lv) * 100 비율 , RANK() OVER(PARTITION BY lv ORDER BY COUNT(*) DESC) rk FROM table_a , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 3) GROUP BY lv , DECODE(lv, 1, 과일 , 2, 채소, 3, 과자 ) ) WHERE rk = 1 ;
헉 고맙습니다. 잘 작동하네요. ^^