mssql에서 sum(case when) 안에 group by를 할수 있나요? 0 2 1,533

by 피터슨 [PL/SQL] [2016.07.20 17:35:15]


안녕하세요

 

select 
convert( char(10),REGI_DD,120 ) as REGI_DD,
sum(case when GUBUN='JA' then 1 else 0 end) as ALL_CNT,
sum(case when GUBUN='JA' and AGENT like '%bot%' then 1 else 0 end) as BOT_CNT,
sum(case when GUBUN='JA' and AGENT not like '%bot%' then 1 else 0 end ) as ATT_CNT
from TB_USER_VIST_INFO
where 
REGI_DD between convert( char(10), getdate()-6, 120 ) and convert( char(10), getdate(), 120 )
and GUBUN='JA'
GROUP by convert(char(10), REGI_DD, 120 ) order by convert(char(10), REGI_DD, 120 )

위에 쿼리 ATT_CNT부분에 group by IP having count(NO) >= 500 이런식으로 group by를 하여

ip 중복되는 값이 500건이상 값을 sum으로 하나에 값으로 합치게 하고싶은데 혹시 방법이 있을까요"?

by 마농 [2016.07.20 18:14:43]

1. Group By 를 2단계로 진행하시면 됩니다.
2. Where 절에 있는 조건을 Case 에 다시 적어줄 필요가 없습니다.
3. Not Like 조건은 얼핏 Like 의 반대조건인 듯 보이지만?
  - 자료에 널이 포함될 경우 결과가 다를 수 있으니 주의 해야 합니다.
4. SUM(CASE THEN 1 ELSE 0) 구문은
  - ELSE 0 을 제거하고 COUNT 로 바꿔주는게 효율적입니다.
  - 단 , NULL 이 조회되길 원치 않는다면 마지막에 ISNULL(cnt, 0) 처리 해주시면 됩니다.
 

SELECT regi_dd
     , ISNULL(SUM(all_cnt), 0) all_cnt
     , ISNULL(SUM(bot_cnt), 0) bot_cnt
     , ISNULL(SUM(CASE WHEN cnt >= 500 THEN att_cnt END), 0) att_cnt
  FROM (SELECT CONVERT(CHAR(10), regi_dd, 120) AS regi_dd
             , ip
             , COUNT(*) all_cnt
             , COUNT(CASE WHEN agent LIKE '%bot%' THEN 1 END) AS bot_cnt
             , COUNT(CASE WHEN agent LIKE '%bot%' THEN NULL ELSE 1 END) AS att_cnt
             , COUNT(no) cnt
          FROM tb_user_vist_info
         WHERE regi_dd BETWEEN CONVERT(CHAR(10), getdate()-6, 120)
                           AND CONVERT(CHAR(10), getdate()  , 120)
           AND gubun = 'JA'
         GROUP BY CONVERT(CHAR(10), regi_dd, 120), ip
        ) a
 GROUP BY regi_dd
 ORDER BY regi_dd
;

 


by 피터슨 [2016.07.20 18:57:21]

전혀 생각도 못했습니다.

솔직히 많이 이해는 못해서 소스는 수정했지만 다시 찾아보면서 이해하면 공부 많이 될 것 같습니다 감사합니다

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