합계,소계구하는 그룹바이 공부중인데 질문입니다. 0 5 2,288

by 에라모르겠다 [Oracle 기초] groupby rollup having grouping_id [2017.09.12 10:32:29]


데이터.png (139,917Bytes)

쿼리 공부 하고 있는데 너무 어려워서 질문남깁니다.

서브쿼리에서 집계된 데이터를 뽑았는데 시작날짜 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가 맞다면 맥스값으로 인해 나오는 합계부분의 데이터 처리방법 

감사합니다.


                   ;

 

by 우리집아찌 [2017.09.12 10:49:03]

어떻게 처리할지는 제가 말씀하기 힘든 부분이고 처리방법은 알려드릴수 있습니다.


by 에라모르겠다 [2017.09.12 10:51:06]

어떻게 해야할지 알려주시면 감사하겠습니다. 저데이터 갖고 안해주셔도 됩니다. 예만 들어주시면 좋겠네요.


by 우리집아찌 [2017.09.12 10:53:45]

처리를 어떻게 할지는 본인이 판단하셔야 하고요..

예를 들면

1. 빈칸으로 한다.

2. FRM_DT는 기간의 MIN값 / TO_DT는 기간의 MAX값을 가져온다.


by 마농 [2017.09.12 10:53:32]

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 으로 뽑아야 하는 것 아닌지?


by 에라모르겠다 [2017.09.12 11:00:45]

다른 사람 쿼리보고 유니온으로 합계 구한거 보고 롤업함수로 변경해보려고 한건데 

아직 부족함이 많네여. 알려주신 대로 한번 분석더 해보겠습니다. 답변감사합니다.

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