집계함수 문의 0 4 1,407

by 가을에사랑 [2018.03.07 16:56:34]


이름별 코드의 평균을 over()로 구하고 나서

이름  a의 2, b의 4, c의 1을 합한 총합 7을 포함해서 출력 하려고

 sum over를 사용했더니 전체 row의 합인 15가 출력이됩니다.

그래서 각 이름별 평균의 최대값을 구하면 하나씩 추출될테니 그렇게 해서 합하면 되겠다 싶어

sum()과 max()를 섞어서  over했더니

윈도우 함수를 사용할 수 없다는 오류가 나오네요...

이리 저리 고민을 해봐도 좋은 방법이 떠오르지 않아 조언을 구해봅니다.

 

이름 코드 코드 별 점수 이름별 평균 총합
a 1 1 2 7
a 2 2 2 7
a 3 3 2 7
b 4 3 4 7
b 5 5 4 7
c 6 1 1 7

 

by 우리집아찌 [2018.03.07 17:16:23]
WITH T (이름,코드,코드별점수,이름별평균,총합) AS (
SELECT 'a','1','1','2','7' FROM DUAL UNION ALL
SELECT 'a','2','2','2','7' FROM DUAL UNION ALL
SELECT 'a','3','3','2','7' FROM DUAL UNION ALL
SELECT 'b','4','3','4','7' FROM DUAL UNION ALL
SELECT 'b','5','5','4','7' FROM DUAL UNION ALL
SELECT 'c','6','1','1','7' FROM DUAL
)
SELECT 이름,코드,코드별점수,이름별평균,총합
     , SUM(CASE WHEN RN=1 THEN 이름별평균 END) OVER() 총합2
  FROM ( SELECT 이름
              , 코드
              , 코드별점수
              , 이름별평균 
              , 총합
              , ROW_NUMBER() OVER(PARTITION BY 이름 ORDER BY NULL) RN
          FROM T 
        )

 


by 가을에사랑 [2018.03.07 17:27:48]

감사드립니다. ^^


by 마농 [2018.03.07 17:23:00]
WITH t AS
(
SELECT 'a' nm, 1 cd, 1 v FROM dual
UNION ALL SELECT 'a', 2, 2 FROM dual
UNION ALL SELECT 'a', 3, 3 FROM dual
UNION ALL SELECT 'b', 4, 3 FROM dual
UNION ALL SELECT 'b', 5, 5 FROM dual
UNION ALL SELECT 'c', 6, 1 FROM dual
)
SELECT nm, cd, v
     , x
     , SUM(DECODE(rn, 1, x)) OVER() y
  FROM (SELECT nm, cd, v
             , AVG(v) OVER(PARTITION BY nm) x
             , ROW_NUMBER() OVER(PARTITION BY nm ORDER BY cd) rn
          FROM t
        )
;

 


by 가을에사랑 [2018.03.07 17:29:07]

아..

SUM(DECODE(rn, 1, x)) OVER() y

decode를 활용할 수도 있군여...감사드립니다. ^^

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