Group by Count(*)가 전체에서 차지하는 비중을 구하고 싶습니다 1 8 1,903

by 좋구만 [SQL Query] [2016.06.30 16:05:32]


FLAG1 FLAG2 CNT AVG LINE
ABC A 35 20% A01
ABC B 44 26% A02
ABC C 46 27% A03
ABC D 29 17% A04
ABC E 20 12% A05

 

AVG라는 컬럼이 현재는 없어서, 위 그림처럼 만들고 싶습니다.

계산식은 (CNT / SUM( cnt )) * 100 as AVG 입니다.

전체를 100으로 볼때 CNT의 비중을 추가하고 싶습니다.

 

분명 방법이 있을 거 같은데.. SELECT 쿼리 늘리는 거 말고는 생각하기 어렵네요..

도움 부탁드립니다~

by jkson [2016.06.30 16:50:25]

WITH  T
AS 
(
select 'ABC' AS FLAG1,'A' AS FLAG2,'35' AS CNT,'A01' AS line from dual union all
select 'ABC' AS C0,'B' AS C1,'44' AS C2,'A02' AS C3 from dual union all
select 'ABC' AS C0,'C' AS C1,'46' AS C2,'A03' AS C3 from dual union all
select 'ABC' AS C0,'D' AS C1,'29' AS C2,'A04' AS C3 from dual union all
select 'ABC' AS C0,'E' AS C1,'20' AS C2,'A05' AS C3 from dual
)
SELECT FLAG1
     , FLAG2
     , CNT
     , ROUND(CNT / SUM(CNT) OVER () * 100) AVG
     , LINE
  FROM T

하고 보니 avg가 total 100 이 안 되네요?? 잠만 생각을.. ㅋ


by bryancheon [2016.06.30 16:58:07]
WITH  T
AS
(
select 'ABC' AS FLAG1,'A' AS FLAG2,'35' AS CNT,'A01' AS line from dual union all
select 'ABC' AS C0,'B' AS C1,'44' AS C2,'A02' AS C3 from dual union all
select 'ABC' AS C0,'C' AS C1,'46' AS C2,'A03' AS C3 from dual union all
select 'ABC' AS C0,'D' AS C1,'29' AS C2,'A04' AS C3 from dual union all
select 'ABC' AS C0,'E' AS C1,'20' AS C2,'A05' AS C3 from dual
)
SELECT FLAG1, FLAG2, CNT, ROUND(RATIO_TO_REPORT("CNT") OVER() * 100, 2) "AVG", LINE
  FROM T;
 
Reference :
 http://20140501.tistory.com/197

 


by jkson [2016.06.30 17:03:28]

아~ RATIO_TO_REPORT 가 있었죠? 역시 자꾸 사용해봐야 하나봅니다. 생각이 안 나네요.


by 좋구만 [2016.07.04 15:36:05]

깔끔하네요ㅎㅎ
감사합니다~~~


by jkson [2016.06.30 17:02:04]
SELECT FLAG1, FLAG2, CNT
     , DECODE(TOTROW, RN, 100 - SUM(AVG) OVER(ORDER BY RN ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ), AVG) AVG
     , LINE 
  FROM
    (
    SELECT FLAG1
     , FLAG2
     , CNT
     , ROUND(CNT / SUM(CNT) OVER () * 100) AVG
     , LINE
     , ROWNUM RN
     , COUNT(1) OVER() TOTROW
    FROM T
    )

뭔가 더 좋은 방법이 있을 것 같은데 모르겠네요. 다시 일하러 갑니다.


by 좋구만 [2016.07.04 15:35:39]

역시 생각에 따라 다른 방법도 있었군요 !!

참고하겠습니다^^ 감사합니다~


by 마농 [2016.06.30 17:03:39]
SELECT flag1, flag2
     , COUNT(*) cnt
     , ROUND(RATIO_TO_REPORT(COUNT(*)) OVER() * 100, 2) avg
     , line
  FROM t
 GROUP BY flag1, flag2, line
;

 


by 좋구만 [2016.07.04 15:34:33]

역시.. 간단한 방법이 있었군요

전혀 모르던 함수네요ㅠㅠ 감사합니다 ~~

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