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
복사