이름별 코드의 평균을 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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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 ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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 ) ; |