안녕하세요
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으로 하나에 값으로 합치게 하고싶은데 혹시 방법이 있을까요"?
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 ;