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 
SQL
복사
위와 같이 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 
SQL
복사
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   
SQL
복사
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               
SQL
복사
COUNT(DISTINCT) 용법은 데이터 분석에 종종 사용된다. 아래 SQL을 살펴보자.
-- [SQL-5-8-7]
-- 22년 12월 24일의 주문 데이터를 조회
SELECT  T1.OrdNo ,T1.OrdDtm ,T1.MemberId ,T1.OrdAmt
FROM    startdb.Ord T1
WHERE   T1.OrdDtm >= STR_TO_DATE('20221224','%Y%m%d')
AND     T1.OrdDtm <  STR_TO_DATE('20221225','%Y%m%d')
ORDER BY T1.OrdNo;
OrdNo  OrdDtm               MemberId  OrdAmt     
-----  -------------------  --------  ---------  
59829  2022-12-24 07:30:00  M1020     4000.000   
59830  2022-12-24 07:30:00  M1050     13000.000  
59831  2022-12-24 07:30:00  M2061     4000.000   
59832  2022-12-24 07:30:00  M3030     7000.000   
... 생략 ...
-- [SQL-5-8-8]
-- 22년 12월 24일의 주문 건수는?
SELECT  COUNT(*) OrdCnt
FROM    startdb.Ord T1
WHERE   T1.OrdDtm >= STR_TO_DATE('20221224','%Y%m%d')
AND     T1.OrdDtm <  STR_TO_DATE('20221225','%Y%m%d');
OrdCnt  
------  
2212    
-- [SQL-5-8-9]
-- 22년 12월 24일에 주문을 한번이라도 한 회원 수는?
-- 이는 데이터 건수와는 다르다. 주문 데이터의 회원Id의 중복을 제거하고 카운트해야 한다.
SELECT  COUNT(*) OrdCnt
        ,COUNT(DISTINCT T1.MemberId) OrdMemberCnt
FROM    startdb.Ord T1
WHERE   T1.OrdDtm >= STR_TO_DATE('20221224','%Y%m%d')
AND     T1.OrdDtm <  STR_TO_DATE('20221225','%Y%m%d');
OrdCnt  OrdMemberCnt  
------  ------------  
2212    2208          
SQL
복사



