무료 동영상 강의 https://youtu.be/ib64Fz3UPn0

HAVING


HAVING은 GROUP BY가 처리된 결과에 필터 조건을 추가하기 위해 사용한다.

-- [SQL-5-4-1]
-- 22년1월1일~22년1월2일 주문 데이터를 ShopId 별로 GROUP BY
-- ShopId별 주문 건수(COUNT(*))가 5건 이상인 데이터만 조회(HAVING 처리)
SELECT  T1.ShopId
        ,SUM(T1.OrdAmt) OrdAmt ,COUNT(*) OrdCnt
FROM    startdb.Ord T1
WHERE   T1.OrdDtm >= STR_TO_DATE('20220101','%Y%m%d')
AND     T1.OrdDtm <  STR_TO_DATE('20220103','%Y%m%d')
GROUP BY T1.ShopId
HAVING COUNT(*) >= 5
ORDER BY OrdCnt DESC;

ShopId  OrdAmt      OrdCnt  
------  ----------  ------  
S001    115500.000  19      
S003    28500.000   5      

-- [SQL-5-4-2]
-- GROUP BY에 없는 OrdSt 컬럼을 집계함수 없이 사용했으므로 오류
-- OrdSt 조건은 WHERE 절에서 사용하거나, 집계함수 처리해서 사용해야 한다.
SELECT  T1.ShopId
        ,SUM(T1.OrdAmt) OrdAmt ,COUNT(*) OrdCnt
FROM    startdb.Ord T1
WHERE   T1.OrdDtm >= STR_TO_DATE('20220101','%Y%m%d')
AND     T1.OrdDtm <  STR_TO_DATE('20220103','%Y%m%d')
GROUP BY T1.ShopId
HAVING T1.OrdSt = 'PKUP' -- > 잘못된 사용
ORDER BY OrdCnt DESC; 

-- [SQL-5-4-3]
-- HAVING 조건도 여러개 조합이 가능
SELECT  T1.ShopId
        ,SUM(T1.OrdAmt) OrdAmt ,COUNT(*) OrdCnt
FROM    startdb.Ord T1
WHERE   T1.OrdDtm >= STR_TO_DATE('20220101','%Y%m%d')
AND     T1.OrdDtm <  STR_TO_DATE('20220103','%Y%m%d')
GROUP BY T1.ShopId
HAVING (COUNT(*) >= 5 OR SUM(T1.OrdAmt) >= 20000)
ORDER BY OrdCnt DESC;

-- [SQL-5-4-4]
SELECT  T1.ShopId
        ,SUM(T1.OrdAmt) OrdAmt ,COUNT(*) OrdCnt
FROM    startdb.Ord T1
WHERE   T1.OrdDtm >= STR_TO_DATE('20220101','%Y%m%d')
AND     T1.OrdDtm <  STR_TO_DATE('20220103','%Y%m%d')
GROUP BY T1.ShopId
HAVING COUNT(*) >= 5 AND SUM(T1.OrdAmt) >= 50000
ORDER BY OrdCnt DESC;

WHERE 절을 거쳐 GROUP BY를 거쳐, HAVING을 거쳐 데이터 집합이 어떻게 변하는지 그려보면 다음과 같습니다.

Untitled

BOOSTER QUIZ


BOOSTER QUIZ ERD

Untitled

BOOSTER QUIZ 5-4-1

아래는 상품카테고리(ItemCat)로 GROUP BY 처리하는 SQL이며 에러가 발생하고 있다. GROUP BY를 유지할 경우, 아래 SQL에서 잘못된 부분 두 곳을 찾으시오.