GROUP BY 관련 데이터 0 1 582

by nodeLosck [SQL Query] [2018.11.09 16:42:25]


안녕하세요 선배님들 쿼리 관련 질문이 있어서 도움을 요청합니다.

아래 쿼리 결과값

TECH_FILD_CD , CNT_PJT , CNT_TECH , CNT_EVLT

       A                34            39           31
       B                 3             39           31
       C                 1             39           31
      합계             38             39           31

여기서 현재 CNT_PJT 값은 실제 TECH_FILD_CD 별로 구분지어서 건수가 나오고 , CNT_TECH,CNT_EVLT 데이터는 TECH_FILD_CD 구분없이 총 건수가 A,B,C합계에 나오고있습니다. CNT_TECH,CNT_EVLT 부분도 CNT_PJT 처럼 각 TECH_FILD_CD에 맞게 조회를 하고싶은데 방법을 못 찾고있어서 질문드립니다.

 

  SELECT

              CASE WHEN TECH_FILD_NM <> '99' THEN TECH_FILD_NM
                   ELSE '합계'
                   END AS TECH_FILD_CD,
                   SUM(CNT_PJT) AS CNT_PJT,
                   SUM(CNT_TECH) AS CNT_TECH,
                   SUM(CNT_EVLT) AS CNT_EVLT  
                    
                  
             FROM (
            SELECT
                     F_CMN_CODENM_CODE(SUBSTR(TECH_FILD_CD,1,6),TECH_FILD_CD) AS TECH_FILD_NM,
                    CNT_PJT,
                    CNT_TECH,
                    CNT_EVLT
               FROM (
              SELECT DECODE(RN, 1, A.TECH_FILD_CD, '99') AS TECH_FILD_CD,  
                     NVL(COUNT(A.PJT_NO),0) AS CNT_PJT
                     ,NVL((SELECT COUNT(RFP_ID) FROM RMTN_PLAN_RFP G WHERE G.BSNS_YEAR='2018' AND G.TECH_FILD_CD = TECH_FILD_CD),0) AS CNT_TECH
                     ,NVL((SELECT COUNT(H.EVLT_RSLT_CD) FROM RMTN_EVLT_DPMT_PJT H WHERE H.EVLT_RSLT_CD = 'P0401601' AND PJT_ID  = H.PJT_ID AND PJT_SEQNO = H.PJT_SEQNO),0) AS CNT_EVLT
                FROM (
                    SELECT
                          F.TECH_FILD_CD, 
                          A.PJT_NO
                          
                
                                 
                      FROM
                      RMTN_RCPN_PJT A ,
                      RMTN_RCPN_PLAN C                           ,
                      RMTN_RCPN_TRGET_RFP D                           ,
                      RMTN_RCPN_PJT_CNYY_RSRH_TERM E                           ,
                      RMTN_PLAN_RFP F     
                    
                  WHERE
                      A.RCPN_PLAN_ID = C.RCPN_PLAN_ID
                      AND A.ATHZ_STTS_CD ='C0200203'
                      AND A.ACMP_YEAR ='2018'
                      AND A.PJT_FILD_CD = 'P0304701'
                      AND C.RCPN_PLAN_ID = D.RCPN_PLAN_ID                         
                      AND A.RFP_ID = D.RFP_ID    
                      AND A.PJT_ID = E.PJT_ID(+)                               
                      AND A.PJT_SEQNO = E.PJT_SEQNO(+)                               
                      AND A.OBY = E.OBY(+)                           
                      AND A.RFP_ID = F.RFP_ID(+)
                         
                   ) A,
                      ( SELECT LEVEL AS TECH_FILD_NM  FROM DUAL CONNECT  BY LEVEL < 1) B,
                      ( SELECT LEVEL AS RN  FROM DUAL CONNECT  BY LEVEL < 3 ) C
                  
                  GROUP BY RN, DECODE(C.RN, 1,  A.TECH_FILD_CD, '99')
                  )
                 
                   )
                
                GROUP BY TECH_FILD_NM
                  ORDER BY TECH_FILD_NM

by 마농 [2018.11.12 10:57:11]

스칼라서브쿼리에 메인쿼리 컬럼 조건 주는 방법이 틀렸네요.
예를 들어 이조건을 보면 (g.tech_fild_cd = tech_fild_cd)
좌변은 서브쿼리의 g 항목이고 우변은 g 를 표시 안해서 메인쿼리의 항목이라고 생각하시면 안됩니다.
이렇게 하면 우변의 tech_fild_cd 는 g.tech_fild_cd 를 의미합니다.
(g.tech_fild_cd = a.tech_fild_cd) 처럼 조건을 명확하게 주셔야 합니다.
합계는 롤업을 이용하시면 편리하구요.
테이블간의 관계가 어찌 되는지 모르겠지만? 불필요하게 복잡한 부분들이 많이 보입니다.
조인 조건이 맞게 주어진 것인지 의문스러운 부분들도 있구요.
이런 부분들은 의심만 갈뿐 실제 데이터를 볼 수 없으니 코치해 드리기 어렵네요.

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