특정순위를 정하고 그 순위 아래는 '기타'로만 그룹지어서 통계를 내려면 어떻게 해야할까요 ? 0 1 2,168

by 정진우 [2014.02.06 14:02:29]


안녕하세요 ^^ 설연휴 이 후에 다시 q&a 에 글을 올리게되었네요. 

궁금한 점은 만약에 아래와 같이 총 30개의 상품과 판매한 수량에 대한 데이터가 있다면 ..

상품명 판매수
A 10
B 20
C 20
D 30
E 10
F 10
G 10
H 50
I 10
J 10
K 10
L 10
M 10
L 10
O 2
P 3
Q 4
R 5
S 6
T 7
U 8
V 9
W 1
X 2
Y 3
Z 4

RANK를 정해서 해당 랭크수까지의 판매 상위를 보여주고

나머지는 평균으로만 데이터를 조회하여 보여주고 싶습니다.


순위 상품명 판매수 판매율
1 H 50 25%
2 D 30 15%
3 B 20 6%
4 C 20 6%
5 A 10 3%
6 기타 80 48%
210 100%

판매수가 같은 게 있다면 상품명이 위인 것으로 정렬을 하고싶구요.

RANK 라는 함수와 GROUP BY ROLLUP 으로 해결해보려했는데..

잘 안풀려서 질문올립니다.

특히 저 기타 부분은 어떻게 처리해야할지 모르겠네요 ..

== 이건 추가적인 질문인데요.

판매율을 소숫점 두자리로 강제 처리할시에 ..

ROLLUP을 통해 합산한 데이터가 99.99가 나올때가 있는데요 ..

합산된 데이터가 99.99 일때 %로 된 데이터중하나의 값을 0.01 올리거나 ..해서

100%로 만드는 방법이 있나요 ..?? ==
by 마농 [2014.02.06 15:32:08]
WITH t AS
(
SELECT 'A' cd, 10 cnt FROM dual
UNION ALL SELECT 'B', 20 FROM dual
UNION ALL SELECT 'C', 20 FROM dual
UNION ALL SELECT 'D', 30 FROM dual
UNION ALL SELECT 'E', 10 FROM dual
UNION ALL SELECT 'F', 10 FROM dual
UNION ALL SELECT 'G', 10 FROM dual
UNION ALL SELECT 'H', 50 FROM dual
UNION ALL SELECT 'I', 10 FROM dual
UNION ALL SELECT 'J', 10 FROM dual
UNION ALL SELECT 'K', 10 FROM dual
UNION ALL SELECT 'L', 10 FROM dual
UNION ALL SELECT 'M', 10 FROM dual
UNION ALL SELECT 'L', 10 FROM dual
UNION ALL SELECT 'O',  2 FROM dual
UNION ALL SELECT 'P',  3 FROM dual
UNION ALL SELECT 'Q',  4 FROM dual
UNION ALL SELECT 'R',  5 FROM dual
UNION ALL SELECT 'S',  6 FROM dual
UNION ALL SELECT 'T',  7 FROM dual
UNION ALL SELECT 'U',  8 FROM dual
UNION ALL SELECT 'V',  9 FROM dual
UNION ALL SELECT 'W',  1 FROM dual
UNION ALL SELECT 'X',  2 FROM dual
UNION ALL SELECT 'Y',  3 FROM dual
UNION ALL SELECT 'Z',  4 FROM dual
)
SELECT rk
     , DECODE(rk, 6, '기타', cd) cd
     , SUM(cnt) cnt
     , ROUND(RATIO_TO_REPORT(SUM(cnt)) OVER(PARTITION BY GROUPING(rk)) * 100, 2) rat
  FROM (SELECT cd, cnt
             , LEAST(6, RANK() OVER(ORDER BY cnt DESC, cd)) rk
          FROM t
        )
 GROUP BY ROLLUP((rk, DECODE(rk, 6, '기타', cd)))
;
-- 추가질문에 대한 답변 --
-- 비율을 구한뒤 합산하면 +- 오차가 발생될수밖에 없지요.
-- 합산한걸 가지고 비율을 구한다면 무조건 100% 지요.
-- 굳이 개별항목에 대한 오차보정을 할 필요는 없을 듯.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입