조건부 평균을 구하는 방법이 궁금합니다 0 6 2,160

by 미설정 [SQL Query] 평균 조건부평균 [2014.11.24 14:38:24]


안녕하세요 항상 눈팅으로 지식을 배워가다가 해결이 안되는 문제가 있어 글 남겨봅니다

지금 평균의 평균을 구하고 있는데요

예시를 학생으로 들겠습니다..

학생의 평균점수를 구하고 그 전체 학생들의 평균을 구하는 중인데

문제는 일부 학생들의 데이터는 보여주되, 평균계산에서는 제외해야 하는 상황입니다

 

이름  평균

김씨  80.00

이씨  90.00

박씨  88.00

최씨  93.00

정씨  72.00

가씨  68.00   -- 전체 평균 계산에서 제외

나씨  55.00   -- 전체 평균 계산에서 제외

평균  84.60

위 처럼 표현하고 싶은데요...

UNION을 사용하지 않고는 방법이 없는걸까요?

현재 사용한 쿼리는 아래와 같습니다

SELECT
   STDT_NM
   , ROUND(AVG(STDT_SC), 2) AS STDT_AVG
FROM TB_STDT
WHERE 1=1
AND STDT_NM NOT IN ('가씨', '나씨')
GROUP BY ROLLUP (STDT_NM)
UNION
SELECT
   STDT_NM
   , ROUND(AVG(STDT_SC), 2) AS STDT_AVG
FROM TB_STDT
WHERE 1=1
AND STDT_NM IN ('가씨', '나씨')
GROUP BY STDT_NM

실제 사용하는 쿼리는 아니지만 최대한 맞게 바꿔보았습니다

 

by 비주류 [2014.11.24 14:49:24]
SELECT
   STDT_NM
   , ROUND(NVL(AVG(DECODE(stdt_nm, '가씨', NULL,
                                   '나씨', NULL,
                                    stdt_sc)), AVG(stdt_sc)), 2) stdt_avg
FROM TB_STDT
WHERE 1=1
GROUP BY ROLLUP (STDT_NM)

by 미설정 [2014.11.24 15:08:01]

다 아는 함수들인데 왜 비주류님처럼 응용이 잘 안될까요ㅜㅜ

감사합니다 많이 배워갑니다


by 마농 [2014.11.24 15:00:31]
SELECT stdt_nm
     , ROUND(
       DECODE(GROUPING(stdt_nm), 0, AVG(stdt_sc)
       , AVG(CASE WHEN stdt_nm NOT IN ('가씨', '나씨') THEN stdt_sc END)
       ), 2) AS stdt_avg
  FROM tb_stdt
 GROUP BY ROLLUP(stdt_nm)
;
SELECT stdt_nm
     , stdt_sc AS stdt_avg
  FROM tb_stdt
 UNION ALL
SELECT Null
     , AVG(stdt_sc) 
  FROM tb_stdt
 WHERE stdt_nm NOT IN ('가씨', '나씨')
;

 


by 미설정 [2014.11.24 15:10:42]

마농님이 알려주신 첫번째 방법으로 적용해보았는데요

결과값이 약간 다르게 나오네요;

비주류님과 다른방법으로 말씀해주셔서 한번 더 배워가며 맞는 값이 나오게 연구해보겠습니다!


by 마농 [2014.11.24 15:22:54]

글쎄요...?
약간의 함수 사용에 대한 차이가 있을 뿐 큰 흐름은 같습니다.
결과가 다르게 나올리가 없는데요?
물론 정렬 순서는 다를 수도 있긴 하겠지만. 계산 결과가 다르지는 않을 것입니다.


by 미설정 [2014.11.24 15:38:38]

죄송합니다 제가 실 적용하다가 오타를 냈네요 ㅜㅜ

다시 한번 감사합니다 

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