안녕하십니까 rollup을 유지하면서 order by 하는 방법을 알고 싶습니다. 1 7 3,319

by 준일정 [SQL Query] mssql sql oracle mysql rollup [2021.11.03 16:12:03]


쿼리질문.png (33,006Bytes)
쿼리질문2.png (26,827Bytes)

 

해당쿼리인데.. 

예를들어 여기서 order by를 써버리면 rollup해서 각 deptno마다 소계를 낸 것이 무너지더라고요

 

해당 rollup문을 유지시키면서 

ename으로 내림차순으로 정렬할 순 없을까요?

by isNull [2021.11.03 16:20:48]

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을 좀 잘못알고 있었군요.


by 마농 [2021.11.03 16:46:03]

GROUP BY 가 항상 정렬을 수반하는 것은 아닙니다.(10G 이후 hash group by)
ROLLUP 의 경우에는 정렬된 결과를 반환하는 경우가 많기는 합니다.(100%는 아님)
즉 위처럼 ename 을 앞으로 빼면 정렬된 결과를 얻을 확율은 높습니다.
다만 질문에서는 DESC 정렬을 원하고 있으므로 이 방법은 안되겠네요.

정렬 구문이 없이 정렬이 되어 나오는 쿼리들이 있습니다.
다만 이런 결과를 100% 정렬이 보장된다라고 생각히면 안됩니다.
정렬이 필요한 경우에는 반드시 정렬 구문을 넣어야 합니다.


by 모래가흙흙 [2021.11.03 16:30:26]

 ORDER BY DEPTNO, ENAME


by 꼬랑지 [2021.11.03 16:31:56]

ORDER BY DEPTNO,ENAME DESC NULLS LAST

 

이걸 원하시나요?


by 마농 [2021.11.03 16:41:05]

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
;

 


by 준일정 [2021.11.03 17:27:34]

혹시 이게 오라클 문법인가요?


by 마농 [2021.11.03 17:40:20]

네. Oracle

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