union 을 한줄로.. 0 10 3,964

by Kaiger [SQL Query] [2017.09.11 16:02:20]


select dprt_cd, rqst_cnt, sprt_cnt
  from (
select 'aaa' dprt_cd, sum('1') as rqst_cnt, sum('') as sprt_cnt

from dual
union
select 'aaa' dprt_cd, sum('') as rqst_cnt, sum('22') as sprt_cnt

from dual
      )
where 1=1

 

실행하면 두줄이 나옵는데 이거를

한줄로 표현이 가능할까요?

dprt_cd rqst_cnt sprt_cnt

aaa           1         2

이런식으로 두줄을 sum 을 해서요..

by 우리집아찌 [2017.09.11 16:11:18]

full outer join


by 마농 [2017.09.11 16:11:28]

최종 Group By ~ SUM 하는 방법도 있지만...
애초에 union 없이 한번의 select 로 가능할 것 같습니다.
말도 안되는 from dual 말고 실체를 보여주세요.


by Kaiger [2017.09.11 16:17:14]

전체 쿼리를 적어보고 적어보고 싶은데 보안상 복사가 힘들어서요.. 방법을 찾아서 올려보겠습니다.. 


by 마농 [2017.09.11 16:25:51]

쿼리를 그대로 보여주기 힘든거 압니다.
그렇지만 from dual 이나, sum('22') 로 표현하는 것은 실제와 전혀 다른 쿼리죠.
실제 쿼리를 대변할 수 있는 대체쿼리를 보여주시면 됩니다.
예를 들면
위 아래 쿼리가 from 절은 똑같은데 where 절만 달라지는 경우라면 쿼리 한방으로 간단하게 해결됩니다.


by Kaiger [2017.09.11 16:41:24]

-- 원본 쿼리입니다.

SELECT
 D2.DPRT_NM
 D2.DPRT_CD
 D2.DPRT_SRTN_SQNC
 SUM(CASE_WHEN NVL(A.COPR_RQPR_ID, '1') != '1' THEN 1 ELSE 0 END) AS RQST_CNT, -- 요청건수
 SUM(CASE_WHEN NVL(C.SRTR_EMPY_NO, '1') != '1' THEN 1 ELSE 0 END) AS SPRT_CNT, -- 지원건수
  FROM CL_COPR_RQST X A
 , CL_COPR_PROS_DPRT_X B
 , CM_DPRT_M D
 , CM_USR_M E
 , CM_DPRT_M F
 , CM_EMP_M G
 , CM_DPRT_M D1
 , CM_DPRT_M D2
 , CM_DPRT_M D3
  WHERE A.COPR_RQST_SEQ = B.COPR_RQST_SEQ(+)
    AND B.COPR_RQST_SEQ = C.COPR_RQST_SEQ(+)
    AND B.PROS_DPRT_SEQ = C.PROS_DPRT_SEQ(+)
    AND A.COPR_RRQST_DPRT_CD = D.DPRT_CD(+)
    AND A.COPR_RQPR_ID = E.USR_ID(+)
    AND B.PROS_DPRT_CD = F.DPRT_CD(+)
    AND C.SRTR_EMPY_NO = G.EMPY_NO(+)
    AND A.COPR_RQST_DPRT_CD = D1.DPRT_CD(+)
    AND D1.UPER_DPRT_CD = D2.DPRT_CD(+)
    AND D2.UPER_DPRT_CD = D3.DPRT_CD(+)
    AND C.SRTR_EMPY_NO = G.EMPY_NO(+)
    AND A.COPR_RQST_DPRT_CD IN (SELECT V.DPRT_CD
    FROM CM_DPRT_M V
    START WITH V.DPRT_CD IN ( SELECT REGEXP_SUBSTR('50000174', '[^,]+',1, LEVEL COL
             FROM DUAL CONNECT BY LEVEL <= REGEXP_COUNT('50000174', ',')+1)
    CONNECT BY PRIOR V.DPRT_CD = V.UPER_DPRT_CD
    )
GROUP BY D2.DPRT_NM, D2.DPRT_CD, D2.DPRT_SRTN_SQNC

-------------------------------------------------------

이걸 쪼개서

SELECT
 D2.DPRT_NM
 D2.DPRT_CD
 D2.DPRT_SRTN_SQNC
 SUM(CASE_WHEN NVL(A.COPR_RQPR_ID, '1') != '1' THEN 1 ELSE 0 END) AS RQST_CNT, -- 요청건수
 SUM('') AS SPRT_CNT, -- 지원건수
  FROM CL_COPR_RQST X A
 , CL_COPR_PROS_DPRT_X B
 , CM_DPRT_M D
 , CM_USR_M E
 , CM_DPRT_M F
 , CM_EMP_M G
 , CM_DPRT_M D1
 , CM_DPRT_M D2
 , CM_DPRT_M D3
  WHERE A.COPR_RQST_SEQ = B.COPR_RQST_SEQ(+)
    AND B.COPR_RQST_SEQ = C.COPR_RQST_SEQ(+)
    AND B.PROS_DPRT_SEQ = C.PROS_DPRT_SEQ(+)
    AND A.COPR_RRQST_DPRT_CD = D.DPRT_CD(+)
    AND A.COPR_RQPR_ID = E.USR_ID(+)
    AND B.PROS_DPRT_CD = F.DPRT_CD(+)
    AND C.SRTR_EMPY_NO = G.EMPY_NO(+)
    AND A.COPR_RQST_DPRT_CD = D1.DPRT_CD(+)
    AND D1.UPER_DPRT_CD = D2.DPRT_CD(+)
    AND D2.UPER_DPRT_CD = D3.DPRT_CD(+)
    AND C.SRTR_EMPY_NO = G.EMPY_NO(+)
    AND A.COPR_RQST_DPRT_CD IN (SELECT V.DPRT_CD
    FROM CM_DPRT_M V
    START WITH V.DPRT_CD IN ( SELECT REGEXP_SUBSTR('50000174', '[^,]+',1, LEVEL COL
             FROM DUAL CONNECT BY LEVEL <= REGEXP_COUNT('50000174', ',')+1)
    CONNECT BY PRIOR V.DPRT_CD = V.UPER_DPRT_CD
    )
GROUP BY D2.DPRT_NM, D2.DPRT_CD, D2.DPRT_SRTN_SQNC

UNION

SELECT
 D2.DPRT_NM
 D2.DPRT_CD
 D2.DPRT_SRTN_SQNC
 SUM('') AS RQST_CNT, -- 요청건수
 SUM(CASE_WHEN NVL(C.SRTR_EMPY_NO, '1') != '1' THEN 1 ELSE 0 END) AS SPRT_CNT, -- 지원건수
  FROM CL_COPR_RQST X A
 , CL_COPR_PROS_DPRT_X B
 , CM_DPRT_M D
 , CM_USR_M E
 , CM_DPRT_M F
 , CM_EMP_M G
 , CM_DPRT_M D1
 , CM_DPRT_M D2
 , CM_DPRT_M D3
  WHERE A.COPR_RQST_SEQ = B.COPR_RQST_SEQ(+)
    AND B.COPR_RQST_SEQ = C.COPR_RQST_SEQ(+)
    AND B.PROS_DPRT_SEQ = C.PROS_DPRT_SEQ(+)
    AND A.COPR_RRQST_DPRT_CD = D.DPRT_CD(+)
    AND A.COPR_RQPR_ID = E.USR_ID(+)
    AND B.PROS_DPRT_CD = F.DPRT_CD(+)
    AND C.SRTR_EMPY_NO = G.EMPY_NO(+)
    AND B.PROS_DPRT_CD = D1.DPRT_CD(+) -- 이부분 다름.
    AND D1.UPER_DPRT_CD = D2.DPRT_CD(+)
    AND D2.UPER_DPRT_CD = D3.DPRT_CD(+)
    AND C.SRTR_EMPY_NO = G.EMPY_NO(+)
    AND B.PROS_DPRT_CD IN (SELECT V.DPRT_CD -- 이부분 다름
    FROM CM_DPRT_M V
    START WITH V.DPRT_CD IN ( SELECT REGEXP_SUBSTR('50000174', '[^,]+',1, LEVEL COL
             FROM DUAL CONNECT BY LEVEL <= REGEXP_COUNT('50000174', ',')+1)
    CONNECT BY PRIOR V.DPRT_CD = V.UPER_DPRT_CD
    )
   AND B.COPR_PRGR_SCD = '4' -- 이부분 다름
GROUP BY D2.DPRT_NM, D2.DPRT_CD, D2.DPRT_SRTN_SQNC

 

------------------------------------------

 

이상입니다.

 


by 마농 [2017.09.11 17:05:52]

쿼리가 이상하네요.
  - 컴마나 괄호등 전반적으로 이상하구요
  - From 절에 c 도 안보이구요.
사용되지 않는 테이블은 아예 처음부터 빼는게 어떤지?
  - D, E, F, G, D3 는 공통적으로 사용되지 않고 있구요.
  - 요청건수를 구할 때 A 만가지고 구하면 될 듯 하구요. (A, D1, D2)
  - 지원건수를 구할 때 B 만가지고 구하면 될 듯 하구요. (B, C, D1, D2)
 


by Kaiger [2017.09.11 17:53:21]

급하게 적느라 c 테이블이 빠진거 같네요..

Union 안쓰고 한쿼리로 가능하시단 말씀이신거죠?? 

Sum 부분을 해당 테이블로 그냥 select 해서 가져오는게 나을까요???


by 마농 [2017.09.11 18:26:14]

물론, 한번에도 가능합니다.
다만, 요청부서와 지원부서가 다를 수 있기 때문에 두개 쿼리로 구분짓는게 좋을 듯 하구요.
대신 위에 언급한 쓸데 없는 부분들을 모두 제거하시기 바랍니다.


by 마농 [2017.09.11 18:33:21]
WITH d0 AS
(
SELECT DISTINCT dprt_cd, uper_dprt_cd
  FROM cm_dprt_m v
 START WITH dprt_cd IN (SELECT REGEXP_SUBSTR(v_dprt_cd, '[^,]+', 1, LEVEL) COL
                          FROM (SELECT '50000174' v_dprt_cd FROM dual)
                         CONNECT BY LEVEL <= REGEXP_COUNT(v_dprt_cd, ',') + 1
                        )
 CONNECT BY PRIOR dprt_cd = uper_dprt_cd
)
SELECT dprt_nm
     , dprt_cd
     , dprt_srtn_sqnc
     , SUM(rqst_cnt) rqst_cnt
     , SUM(sprt_cnt) sprt_cnt
  FROM (SELECT d2.dprt_nm
             , d2.dprt_cd
             , d2.dprt_srtn_sqnc
             , COUNT(*) rqst_cnt
             , 0        sprt_cnt
          FROM cl_copr_rqst_x a
             , d0
             , cm_dprt_m d2
         WHERE a.copr_rqst_dprt_cd = d0.dprt_cd
           AND d0.uper_dprt_cd     = d2.dprt_cd(+)
           AND a.copr_rqpr_id     != '1'
         GROUP BY d2.dprt_nm, d2.dprt_cd, d2.dprt_srtn_sqnc
         UNION ALL
        SELECT d2.dprt_nm
             , d2.dprt_cd
             , d2.dprt_srtn_sqnc
             , 0        rqst_cnt
             , COUNT(*) sprt_cnt
          FROM cl_copr_pros_dprt_x b
             , ??????????????????? c
             , d0
             , cm_dprt_m d2
         WHERE b.copr_rqst_seq     = c.copr_rqst_seq(+)
           AND b.pros_dprt_seq     = c.pros_dprt_seq(+)
           AND b.pros_dprt_cd      = d0.dprt_cd
           AND d0.uper_dprt_cd     = d2.dprt_cd(+)
           AND b.copr_prgr_scd     = '4'
           AND c.srtr_empy_no     != '1'
         GROUP BY d2.dprt_nm, d2.dprt_cd, d2.dprt_srtn_sqnc
        )
 GROUP BY dprt_nm, dprt_cd, dprt_srtn_sqnc
;

 


by Kaiger [2017.09.12 09:24:30]

감사합니다!!  잘해결되었습니다다좋은 하루 보내세요

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