마농님이 풀어주신 누계질문에서 0 5 2,397

by 러드 [2009.08.13 09:40:50]


WITH test AS
(
SELECT '58000' deptno, 10000000 sal FROM dual
UNION ALL SELECT '59000', 20000000 FROM dual
UNION ALL SELECT '57000', 20120000 FROM dual
)
SELECT DECODE(GROUPING(1),0,deptno) deptno
, DECODE(GROUPING(1),0,SUM(sal),SUM(SUM(sal)) OVER(ORDER BY ROWNUM)/2) sal
FROM test
GROUP BY ROLLUP(1), ROWNUM, deptno
;

GROUPING(1) -> 에 대한 의미가 무엇입니까??

 ROLLUP(1) -> 에 숫자와 같지 않으면 안되던데

by 마농 [2009.08.13 09:54:34]
롤업엔 보통 컬럼이 오는데요, 컬럼이 아닌 상수를 사용한것입니다.
보통 컬럼의 종류만큼 그룹이 생겨 그룹별로 합계가 나타나게 되는데요
여기에 상수를 사용한다는것은 딱 한가지 종류밖에 없는 컬럼이라고 생각하시면 되겠네요.
grouping(항목) 은 항목에 대해서 rollup이 적용이 된 레코드인지 아닌지를 판단해주는 함수입니다.
다시말해 그룹바이 항목으로 사용된 것만 grouping함수에 사용될 수 있습니다.

by 러드 [2009.08.13 11:40:35]
대충 비슷하게 이해는 한 느낌인데;;;;
감사합니다.

by 전창환 [2009.08.13 12:23:18]
WITH test AS
(
SELECT '58000' deptno, 10000000 sal FROM dual
UNION ALL SELECT '59000', 20000000 FROM dual
UNION ALL SELECT '57000', 20120000 FROM dual
)
SELECT DECODE(GROUPING(deptno),0,deptno) deptno
, DECODE(GROUPING(deptno),0,SUM(sal),SUM(SUM(sal)) OVER(ORDER BY ROWNUM)/2) sal
FROM test
GROUP BY ROLLUP(deptno), ROWNUM;

이거랑 같은거죠...

by 러드 [2009.08.13 12:58:58]
ㅋㅋㅋ
그렇게 테스트를 해봤는데 안나오던데 ;;;

그룹바이 절에 deptno를 지워야 했네요 ㅎㅎ

by 마농 [2009.08.13 12:59:36]
아하.. 제가 문제를 어렵게 풀었군요.
SELECT deptno
, DECODE(GROUPING(deptno),0,SUM(sal),SUM(SUM(sal)) OVER(ORDER BY ROWNUM)/2) sal
FROM test
GROUP BY ROWNUM, ROLLUP(deptno)
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입