Search

5-8. DISTINCT

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
복사
Upper: 5. GROUP BY