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) 를 사용해 중복이 제거된 데이터를 카운트할 수 있다. 아래와 같이 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