DISTINCT


GROUP BY는 GROUP BY 에 정의된 항목을 기준으로 데이터를 그룹화한다. 그룹화하는 과정에서 같은 값을 가진 데이터끼리 모이게 되며, 결과적으로 중복된 데이터는 제거된 결과가 나오게 된다.

아래는 Item 테이블을 ItemCat로 GROUP BY한 SQL이다.

-- [SQL-5-8-1]
SELECT  T1.ItemCat 
FROM    startdb.Item T1
WHERE   T1.ItemSizeCd = 'REG'
AND     T1.LaunchDt = STR_TO_DATE('20190101','%Y%m%d')
GROUP BY T1.ItemCat
ORDER BY T1.ItemCat;

ItemCat  
-------  
BEV      
BKR      
COF 

위와 같이 ItemCat의 중복을 제거한 결과만 얻고 싶다면, GROUP BY가 아닌 DISTINCT 절을 사용해도 된다.

-- [SQL-5-8-2]
SELECT  DISTINCT T1.ItemCat 
FROM    startdb.Item T1
WHERE   T1.ItemSizeCd = 'REG'
AND     T1.LaunchDt = STR_TO_DATE('20190101','%Y%m%d')
ORDER BY T1.ItemCat;

ItemCat  
-------  
BEV      
BKR      
COF 

DISTINCT에 여러 컬럼을 사용할 수 있으며, 컬럼을 변형해서 사용할 수도 있다. 아래는 Ord테이블의 주문년도와 주문상태(OrdSt)의 종류를 출력하는 SQL이다.

-- [SQL-5-8-3]
SELECT  DISTINCT DATE_FORMAT(T1.OrdDtm,'%Y') OrdYear ,T1.OrdSt
FROM    startdb.Ord T1
ORDER BY 1 ,2;

OrdYear  OrdSt  
-------  -----  
2019     PKUP   
2020     PKUP   
2021     PKUP   
2022     PKUP   
2023     MFGC   
2023     PKUP   
2023     PREP   
2024     MFGC   
2024     PKUP   
2024     PREP   

DISTINCT 는 단순히 중복을 제거할 뿐이다. 집계함수와 같은 기능을 사용할 수 없다. 단순히 중복 제거가 목표라면 DISTINCT를 사용하고, 데이터 그룹별로 집계가 필요하다면 GROUP BY와 집계함수를 사용해야 한다.

COUNT(DISTINCT)


COUNT(DISTINCT) 를 사용해 중복이 제거된 데이터를 카운트할 수 있다. 아래와 같이 Item을 차례대로 조회해보자. COUNT(DISTINCT)는 중복을 제거하고 카운트를 처리한다. 결과적으로 값의 종류 수를 구할 수 있다.

-- [SQL-5-8-4]
-- BEV인 Item 조회(다섯 건 조회)
SELECT  T1.ItemId ,T1.ItemNm ,T1.HotColdCd ,T1.ItemCat
FROM    startdb.Item T1
WHERE   T1.ItemCat = 'BEV'
ORDER BY T1.HotColdCd;

ItemId  ItemNm             HotColdCd  ItemCat  
------  -----------------  ---------  -------  
CITR    Yuzu Ade(R)        COLD       BEV      
HCHB    Hot Chocolate(B)   HOT        BEV      
HCHR    Hot Chocolate(R)   HOT        BEV      
LEMR    Lemonade(R)        COLD       BEV      
ZAMB    Grapefruit Ade(R)  COLD       BEV      

-- [SQL-5-8-5]
-- BEV인 Item 조회 - HotColdCd DISTINCT 처리(두 건 조회)
SELECT  DISTINCT T1.HotColdCd
FROM    startdb.Item T1
WHERE   T1.ItemCat = 'BEV'
ORDER BY T1.HotColdCd;

HotColdCd  
---------  
COLD       
HOT        

-- [SQL-5-8-6]
-- COUNT DISTINCT 용법
SELECT  COUNT(*) DataCnt
        ,COUNT(T1.HotColdCd) HotColdCnt
        ,COUNT(DISTINCT T1.HotColdCd) DistHotColdCnt
FROM    startdb.Item T1
WHERE   T1.ItemCat = 'BEV'
ORDER BY T1.HotColdCd;

DataCnt  HotColdCnt  DistHotColdCnt  
-------  ----------  --------------  
5        5           2