group by는 내부적으로 sort를 동반합니다. 그러니 group by를 사용하면서 별도로 order by를 하면 두번의 정렬을 하는거죠.
그 말은 group by만 잘하면 한번에 정렬까지 잘 할수 있겠죠. 그리고 ORDER BY는 가장 마지막에 실행됩니다.
그래서 ROLLUP 후에 다시 정렬하니까 어그러지는거죠.
위 쿼리에서는
---
SELECT EMPNO
, ENAME
, JOB
, MGR
, HIREDATE
, SUM(SAL) AS SUM_SAL
, COMM
, DEPTNO
FROM EMP
GROUP BY DEPTNO, ROLLUP((ENAME, EMPNO, JOB, MGR, HIREDATE, SAL, COMM))
---
위 처럼하시면 아마 부서별 이름순으로 정렬이 될거 같습니다.
P.S. 해보니 제가 ROLLUP을 좀 잘못알고 있었군요.
1. group by 에 sal 항목은 빼야죠.
2. 정렬 구문에 deptno 가 있어야죠.
3. SUM(sal) 부분에는 알리아스 주세요.
SELECT empno , ename , job , mgr , hiredate , SUM(sal) sal , comm , deptno FROM emp GROUP BY deptno, ROLLUP((empno, ename, job, mgr, hiredate, comm)) ORDER BY deptno, ename DESC NULLS LAST ;
혹시 ename 을 가공하여 소계를 표기하는 경우라면?
, NVL(ename, '소계') ename
정렬 항목 기술에 유의해야 합니다.
ORDER BY ename 하면 안됩니다.(가공된 결과에 대한 정렬, 소계 포함)
ORDER BY emp.ename 해야 합니다.(가공전 결과에 대한 정렬, NULL 포함)
SELECT empno , NVL(ename, '소계') ename , job , mgr , hiredate , SUM(sal) sal , comm , deptno FROM emp e GROUP BY deptno, ROLLUP((empno, ename, job, mgr, hiredate, comm)) ORDER BY deptno, e.ename DESC NULLS LAST ;