rollup order by 질문입니다. 0 12 11,362

by 최영일 [PL/SQL] rollup order by [2013.04.11 01:22:31]


안녕하세요~

오랜만에 질문 날립니다~~^^

 GROUP BY ROLLUP(EMP_NO,(A_ZONE_CODE,F_NO,  REPORT_YM, C_NO,W_FORM, W_STATUS ))

해서 나온 데이터는 아래와 같습니다.

지역(    A_ZONE_CODE)    구(F_NO) 이름(emp_no 로 이름을 가져옴)  집계     월
부산 북구 홍길동 1          1월
 null null 소계 1
서울 강남 이순신 4           1월
null null 소계 4
null null 합계 5

이런식으로 데이터가 나옵니다.

데이터는 뽑았는데요 정렬이 문제네요..ㅜㅜ

order by를 주면 소계가 모두 데이터 아래로 나옵니다.


제가 뽑고 싶은 데이터는 

A_ZONE_CODE(코드값) ASC,
UFN_GET_FNAME(F_NO)  ㄱ,ㄴ,ㄷ 순입니다.



서울 강남       홍길동 1월  2건
서울 강남      홍길동 2월 3건
null    null       소계    null  5건
서울  강서     이순신 1월 3건
null    null        소계   null  3건


이런식으로 하고 싶습니다.


수고하세요~~

감사합니다~




by 마농 [2013.04.11 08:10:12]

롤업의 구조와 결과가 이해가 안가네요.
empno 가 롤업의 선두컬럼이네요? 기타 다른 항목들을 괄호로 묶었구요.
empno 는 유니크한 항목일 듯 한데요.
그렇다면 소계가 empno 한줄당 하나씩 생긴다는 거네요.
이런 소계가 의미가 있는지 모르겠네요?


by 최영일 [2013.04.11 10:34:24]
아~빼먹은게 있네요..ㅎㅎ 월별 누적이라 REPORT_YM(YYYYMM) 에 데이터가 들어가 있습니다.

서울   강남   1월   홍길동  3
서울   강남   2월   홍길동  4
NULL  NULL NULL 소계   7

이렇게 나올수도 있다는 거죠...
현재 데이터는 원하는데로 나오고 있습니다.

정렬이 문제네요..ㅜㅜ  



by 마농 [2013.04.11 10:55:35]

정렬기준이 뭔가요? 정렬기준에 empno 나 report_ym 이 들어 있나요?
같은 유저인데 중간에 지역이 바뀌는 경우는 없나요?


by 최영일 [2013.04.11 11:17:15]
정렬기준은
지역코드값(A_ZONE_CODE) ASC ,
F_NO 코드값을 한글로 변경한 ㄱ,ㄴ,ㄷ 
EMP_NO 사원번호 이름으로 변경한 ㄱ,ㄴ,ㄷ 

순입니다.

그래서 아래와 같이 했는데요

ORDER BY 
A_ZONE_CODE ,
F_NO_NAME,  --> F_NO 코드값 한글 변경
EMP_NO_NAME  --> 사원번호로 사원이름 가져옴

이렇게 하니 데이터는 나오는데요 소계가 전부 아래로 떨어지네요..
GROUPING_ID 써보고 해도 잘안되서요..^^


by 마농 [2013.04.11 11:06:08]
SELECT ...
  FROM 테이블 a
 GROUP BY ROLLUP(emp_no, (a_zone_code, f_no, report_ym, c_no, w_form, w_status))
 ORDER BY MIN(a.a_zone_code), MIN(ufn_get_fname(a.f_no)), emp_no_name, a.report_ym
;

by 최영일 [2013.04.11 11:27:06]
친절한 답변 감사합니다.

답변대로 했는데요 해당 직원의 소계가 데이터 아래쪽으로 뭉쳐서 나오네요..ㅜㅜ

마농님이 정렬주신대로 데이터가 나오되 각각 직원별로 소계가 나와야 합니다.ㅜㅜ

같은 서울 강남에 강길동이라는 직원도 1,2,3월에 집계 건수가 있다면 3row가 나오고 그아래 소계가 나오면 됩니다. 
그아래 서울 강남에 김길동이라는 직원이 1월 집계건수만 있다면 1row 데이터가 나오구요 그라래 소계가 나오구요 

이런식입니다.

너무 설명을 못하네요..ㅜㅜ

by 마농 [2013.04.11 11:30:39]
emp_no_name 항목을 어떻게 뽑았나요?
다른 테이블과 조인하여 뽑았다면 b.emp_no_name 이라고 표시하세요.
ORDER BY MIN(a.a_zone_code)
, MIN(ufn_get_fname(a.f_no))
, b.emp_no_name -- 이부분 테이블 알리아스 붙여주시고
, a.emp_no -- 이부분 추가요(동명이인을 구분하기 위한 항목)
, a.report_ym

by 최영일 [2013.04.11 11:41:10]
emp_no_name  SELECT 절에서 사원번호를 넘기면 이름을 가져오는 함수가 있습니다.

그 함수로 뽑아 왔습니다.

어떻게 해도 소계가 아래로 내려가네요..ㅜㅜ



by 디케이 [2013.04.11 12:17:53]
 WITH
T(Z_NO, F_NO, EMP_NO, YM ) AS
(   SELECT '부산', '북구', '홍길동', '1월' from dual
UNION ALL SELECT '부산', '북구', '홍길동', '1월' from dual
UNION ALL SELECT '부산', '북구', '홍길동', '2월' from dual
UNION ALL SELECT '부산', '북구', '홍길동', '2월' from dual
UNION ALL SELECT '부산', '남구', '홍길동', '1월' from dual
UNION ALL SELECT '부산', '남구', '홍길동', '2월' from dual
UNION ALL SELECT '부산', '남구', '홍길동', '3월' from dual
UNION ALL SELECT '서울', '강남', '이순신', '1월' from dual
UNION ALL SELECT '서울', '강남', '이순신', '1월' from dual
UNION ALL SELECT '서울', '강남', '이순신', '2월' from dual
)
 
SELECT DECODE(grouping(YM), 1, NULL, Z_NO) Z_NO
    , DECODE(grouping(YM), 1, NULL, F_NO) F_NO
    , DECODE(grouping(YM), 1, NULL, EMP_NO) EMP_NO
    , decode(grouping(Z_NO), 1, '합계', DECODE(grouping(YM), 1, '소계', YM)) YM , COUNT(1)
 from t
 GROUP BY GROUPING SETS((Z_NO, F_NO, EMP_NO, YM),(Z_NO, F_NO, EMP_NO), ())

by 마농 [2013.04.11 12:47:21]

ORDER BY MIN(a.a_zone_code)
, MIN(ufn_get_fname(a.f_no))
, 함수명(a.emp_no) -- 이부분 Select 절에 썼던 대로
, a.emp_no -- 이부분 추가요(동명이인을 구분하기 위한 항목)
, a.report_ym

그래도 안된다면 사용하신 전체 쿼리를 올려주세요.


by 마농 [2013.04.11 14:10:54]
ORDER BY GROUPING(tbl.charge_employee_no)
, MIN(tbl.admin_zone_code)
, MIN(ufn_get_facilityname(tbl.facility_no))
, ufn_get_employeename(tbl.charge_employee_no)
, tbl.charge_employee_no
, tbl.report_yearmonth
;

by 최영일 [2013.04.11 14:44:14]
정말 정말 감사합니다~!!!!! ㅜㅜ
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입