하나의 테이블에서 조회조건이 각각 다른 경우 sum 하는 최선의 방법은? 0 3 2,323

by 게릴라 [SQLServer] mssql sum union [2022.02.09 11:38:20]


안녕하세요.

아래와 같은 쿼리를 작성했는데 sum해야할 대상 컬럼의 조회조건이 각각 달라서 union all 로 처리했습니다.

SELECT SUM(A_CNT) ,
        SUM(B_CNT),
        SUM(C_CNT)
 FROM (
     SELECT COUNT(SEQ) AS A_CNT, 
            0 AS B_CNT, 
            0 AS C_CNT
       FROM TARGET_TABLE WITH(NOLOCK)
      WHERE REG_DT BETWEEN '조회시작일' AND '조회종료일'  AND  CONDITION_ID = 'A'  

      UNION ALL

     SELECT 0 AS A_CNT, 
            COUNT(SEQ) AS B_CNT, 
            0 AS C_CNT
       FROM TARGET_TABLE WITH(NOLOCK)
      WHERE REG_DT BETWEEN '조회시작일' AND '조회종료일'  AND  CONDITION_VAL > 0

      UNION ALL

       SELECT 0 AS A_CNT, 
            0 AS B_CNT, 
            COUNT(SEQ) AS C_CNT
       FROM TARGET_TABLE WITH(NOLOCK)
      WHERE   REG_DT BETWEEN '조회시작일' AND '조회종료일'  AND  CONDITION_TYPE = 'O'  
 )

*조회조건 REG_DT에 클러스터드 index

이 쿼리를 수정하여 성능을 개선하고 싶은데 sum over partition by 구문으로 변경이 가능할까요.

 

오라클이면 

select

count(distinct case when CONDITION_ID = 'A' then SEQ end) over (partition by SEQ) as A_CNT,

count(distinct case when CONDITION_VAL > 0 then SEQ end) over (partition by SEQ) as B_CNT,

count(distinct case whenCONDITION_TYPE = 'O' then SEQ end) over (partition by SEQ) as C_CNT

같은 형태로 가능할 거 같은데 mssql에선 오류가 나서...

좋은 방법이 없을까요?

 

긴 글 읽어주셔서 감사합니다.

고견 부탁드립니다.

 

by pajama [2022.02.09 12:36:21]

Sum case 를 같이 쓰면 되지 않을까요? 밖이라서 이따가 저도 테스트해보겠습니다 ㅎ


by 마농 [2022.02.09 13:09:31]
-- 공통 조건은 WHERE 절에
-- 개별 조건은 SELECT 절의 CASE 구문으로
SELECT COUNT(CASE WHEN condition_id   = 'A' THEN 1 END) a_cnt
     , COUNT(CASE WHEN condition_val  >  0  THEN 1 END) b_cnt
     , COUNT(CASE WHEN condition_type = 'O' THEN 1 END) c_cnt
  FROM target_table WITH(NOLOCK)
 WHERE reg_dt BETWEEN '조회시작일' AND '조회종료일'
;

 


by 게릴라 [2022.02.09 13:20:20]

두분 답변 정말 감사드립니다^^

 

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