rollup 사용시 order by관련 질문입니다. 0 4 1,060

by DB초보 [SQL Query] [2015.07.14 10:31:22]


캡처.PNG (33,082Bytes)
zd.PNG (25,344Bytes)

안녕하십니까!

현재 rollup 함수를 사용해서 계,소계,합계를 구하는 쿼리를 만들고있는데요..

결과는 문제없이 나오는데 소팅이 문제가 되네요...합계,소계,계를 구할때 Decode를 사용해서 하는데

해당 컬럼외에 다른 컬럼으로도 order by를 하고싶은데..방법이 있을까요;

해당 컬럼이 Group by에는 안들어가다 보니 order by에도 못들어가고....

SELECT DECODE(Z1.MON, NULL,'합계',Z1.MON) AS MON, DECODE(Z1.TEAM,NULL,'소계',MAX(Z1.TEAM)) AS TEAM,

             DECODE(Z1.VOY_NO,NULL,'계',Z1.VOY_NO) AS VOY_NO
            ,DECODE(Z1.VOY_NO,NULL,' ',MAX(Z1.CTYPE)) AS CTYPE

             , DECODE(Z1.VOY_NO,NULL,' ',MAX(Z1.VSLNM)) AS VSLNM

             , DECODE(Z1.VOY_NO, NULL,' ',MAX(Z1.CHRRNM)) AS CHRRNM
              ,DECODE(Z1.VOY_NO,NULL,' ',MAX(Z1.BIZNM)) AS BIZNM

              , DECODE(Z1.VOY_NO,NULL,' ',MAX(Z1.ST_DT)) || DECODE(Z1.VOY_NO,NULL,' ','~') ||DECODE(Z1.VOY_NO,NULL,' ',MAX(Z1.END_DT)) AS VOY_DT

FROM Z1,Z2
WHERE Z1.TEAM = Z2.TEAM
GROUP BY ROLLUP(Z1.MON, Z1.TEAM,Z1.VOY_NO)
ORDER BY Z1.MON, Z1.TEAM,Z1.VOY_NO

현재 이렇게 하면 문제없이 잘 나옵니다..

ORDER BY 마지막에 Z1.ST_DT순으로도 정렬을 하고싶은데..어떻게 해야할까요?

GROUP BY절에 ROLLUP 바깥에 해당 컬럼을 넣게 되면 VOY_NO 수만큼 계와 소계가 쭉~나오게 됩니다;;

그렇다고 Rollup안에 Z1.ST_DT를 넣게 되면 각 VOY_NO가 2개씩 중복되어 나옵니다.

해결방안 조언부탁드려요ㅜ.ㅜ


 

by 마농 [2015.07.14 11:03:34]

1. 주키가 되는 voy_no 에 종속되는 데이터들은 롤업사용시 주키와 함게 괄호로 묶어주세요.
2. NVL 을 사용할 위치에 복잡하게 DECODE 를 사용했네요.
3. Z2 는 아무데도 쓰이질 않는데 왜 조인했을까요?
 

SELECT NVL(z1.mon   , '합계') AS mon
     , NVL(z1.team  , '소계') AS team
     , NVL(z1.voy_no, '계'  ) AS voy_no
     , NVL(z1.ctype , ' '   ) AS ctype
     , NVL(z1.vslnm , ' '   ) AS vslnm
     , NVL(z1.chrrnm, ' '   ) AS chrrnm
     , NVL(z1.biznm , ' '   ) AS biznm
     , NVL2(z1.st_dt, z1.st_dt||'~'||z1.end_dt, ' ') AS voy_dt
  FROM z1
--     , z2
-- WHERE z1.team = z2.team
 GROUP BY ROLLUP( z1.mon, z1.team
                , (z1.voy_no, z1.ctype, z1.vslnm, z1.chrrnm, z1.biznm, z1.st_dt, z1.end_dt)
                )
 ORDER BY z1.mon, z1.team, z1.st_dt, z1.voy_no
;

 


by DB초보 [2015.07.14 11:27:42]

정말 감사합니다!!!

아..여기서 Z1, Z2는 아래에 서브쿼리들이 있습니다^^;;;

쿼리가 너무 길다보니 해당 서브쿼리는 제외하고 작성했었습니다!

Rollup안에 메인키 컬럼이랑 나머지를 다시 괄호를 묶을 생각은 전혀못했네요;;

정말 감사합니다!!!!

DECODE랑 NVL은 쓰임새가 다른건가요? 그럼 어떨때 DECODE를 쓰면 유용할까요?


by 마농 [2015.07.14 11:37:17]

NVL 은 단순 널처리 함수이구요.
DECODE 는 다양한 조건을 주고 응용할 수 있는 함수입니다.
DECODE 를 NVL 처럼 사용할 수도 있겠죠.
DECODE 는 응용력이 무궁무진한 반면에 함수가 좀 무겁습니다.
단순 널처리를 하기 위함이라면 당연히 가벼운 NVL 을 써야 하구요.
복잡한 조건 처리를 해야 할 때 Decode 나 Case 문을 쓰죠.


by DB초보 [2015.07.14 14:27:52]

감사합니다~!

NVL써서 쿼리 작성해야겠네요~!

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