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