by 에라모르겠다 [Oracle 기초] groupby rollup having grouping_id [2017.09.12 10:32:29]
쿼리 공부 하고 있는데 너무 어려워서 질문남깁니다.
서브쿼리에서 집계된 데이터를 뽑았는데 시작날짜 FRM_DT 와 TO_DT에 대한 정보를 같이 넘겨줘야 해서 일단 맥스값으로 추출 했는데
이렇게 하는 방식이 맞는지 모르겠으며
집계데이터+ 집계함수에 필요하지 않은 데이터( 아래에선 FRM_DT,TO_DT 같은 것들) 에 대해 어떤 방식으로 쿼리를 만들어야 할지 아직 이해가 어렵네요.
SELECT A.RQST_SEQ,
FNCO_COMM_NM(B.INCM_CLS) AS INCM_CLS_NM,
B.EARN_NM,
A.EARN_NO,
FNCO_DT(FRM_DT, '-')|| ' ~ ' ||FNCO_DT(TO_DT, '-') AS INCM_DT,
A.INCM_TAX,
A.INHABT_TAX,
A.RQST_AMT,
A.NET_AMT
FROM (
SELECT NVL(RQST_SEQ,'합계')RQST_SEQ
, EARN_NO
,MAX(FRM_DT)FRM_DT
,MAX(TO_DT)TO_DT
,SUM(INCM_TAX) INCM_TAX
,SUM(INHABT_TAX) INHABT_TAX
,SUM(RQST_AMT)RQST_AMT
,SUM(NET_AMT)NET_AMT
FROM TNAC_INCM_EXPT_DTL
WHERE RQST_NO = 'ACM04201709070002'
GROUP BY ROLLUP (RQST_SEQ,EARN_NO) HAVING GROUPING_ID (RQST_SEQ,EARN_NO) != 1
)A
LEFT OUTER JOIN TNAC_INCM_EARN B ON A.EARN_NO = B. EARN_NO
추출된 데이터 첨부하며
그리고 맥스값으로 추출해서 그런지 합계 부분에 INCM_DT의 최대값이 같이 찍힙니다. 이 부분은 어떻게 처리 하는게 좋을지 알려주시면 감사하겠습니다.
꼭 위에 있는 데이터로 예시 안들어주셔도 되고
한번더 요약하자면
1. 집계함수+ 집계함수에 필요하지 않은 데이터의 처리 방법
2. MAX값으로 추출하는게 일반적인지 여부
3. 2가 맞다면 맥스값으로 인해 나오는 합계부분의 데이터 처리방법
감사합니다.
;
1. GROUP BY ROLLUP 후에 발생된 소계를 HAVING 절로 제거하는 것은
- 처음부터 롤업할 때 괄호로 묶어주면 소계 안나옵니다.
- ROLLUP ((rqst_seq, earn_no))
2. 합계에 max 값이 찍히는 것은
- 해당 max 를 사용한 항목의 값이 여러개인지? 단일값인지? 에 따라 해결방법이 다릅니다.
2-1. 단일 값인 경우, group by 기준항목에 종속적인 값인 경우라면?
- group by 에 포함시키고 max 를 제거하시면 됩니다.
- ROLLUP ((rqst_seq, earn_no, frm_dt, to_dt))
2-2. 여러개의 값중 max 를 뽑는 것이라면?
- having 절에서 GROUPING_ID 사용하여 소계를 제거한것과 동일한 방법입니다.
- select 절에서 case 문을 이용하여 합계일 경우 빈값을 출력하도록 하면 됩니다.
- CASE WHEN GROUPING(rqst_seq) = 0 THEN MAX(frm_dt) END
- 그런데 frm_dt 는 max 가 아닌 min 으로 뽑아야 하는 것 아닌지?