하나의 SQL에서 조인과 GROUP BY를 동시에 사용할 수 있다. 조인과 GROUP BY를 동시 사용하는 패턴은 데이터 분석이나 리포트를 만들때 매우 많이 사용된다. 조인은 데이터 집합을 좌우로 연결시키고, GROUP BY는 데이터를 그룹핑한다. 테이블에 저장된 원천 데이터는 조인과 GROUP BY를 거치면서 우리에게 좀 더 유용한 가치를 전달해 줄 수 있다.
SQL로 아래와 같은 데이터를 만들어보자.
위의 데이터를 만들기 위해서는 매장과 주문을 조인해야 한다. 매장에서는 ShopStartYmd가 2018년 4월 5일인 데이터를, 주문에서는 OrdDtm이 2019년 11월인 주문을 찾아 조인해야 한다. 조인 SQL을 만들어 보면 다음과 같다.
-- [SQL-7-5-1] 조인만 작성
SELECT T1.ShopId ,T1.ShopOperTp ,T2.OrdNo ,T2.OrdDtm
FROM startdb.Shop T1
INNER JOIN startdb.Ord T2
ON (T2.ShopId = T1.ShopId)
WHERE T1.ShopStartYmd = '20180405'
AND T2.OrdDtm >= STR_TO_DATE('20191101','%Y%m%d')
AND T2.OrdDtm < STR_TO_DATE('20191201','%Y%m%d')
ORDER BY T1.ShopOperTp ,T2.OrdDtm;
ShopId ShopOperTp OrdNo OrdDtm
------ ---------- ----- -------------------
S019 DIST 236 2019-11-02 13:00:00
S019 DIST 389 2019-11-30 13:00:00
S047 DRCT 240 2019-11-04 14:00:00
S047 DRCT 269 2019-11-06 14:00:00
S047 DRCT 273 2019-11-08 14:00:00
S047 DRCT 305 2019-11-13 14:00:00
S047 DRCT 315 2019-11-21 14:00:00
S005 FLAG 246 2019-11-05 10:00:00
S005 FLAG 281 2019-11-11 10:00:00
S005 FLAG 322 2019-11-23 10:00:00
S005 FLAG 353 2019-11-29 10:00:00
최종 결과는 ShopOperTp별 주문 건수다. 조인으로 얻은 위 데이터 결과를 ShopOperTp로 GROUP BY 처리한다고 생각하면 된다. 위 SQL을 다음과 같이 GROUP BY로 변경하자.
-- [SQL 7-5-2] 조인 결과를 ShopOperTp별 GROUP BY 처리
SELECT T1.ShopOperTp -- > GROUP BY 컬럼을 SELECT 절에 사용
,COUNT(*) OrdCnt -- > 주문 건수를 카운트
FROM startdb.Shop T1
INNER JOIN startdb.Ord T2
ON (T2.ShopId = T1.ShopId)
WHERE T1.ShopStartYmd = '20180405'
AND T2.OrdDtm >= STR_TO_DATE('20191101','%Y%m%d')
AND T2.OrdDtm < STR_TO_DATE('20191201','%Y%m%d')
GROUP BY T1.ShopOperTp -- > GROUP BY 추가
ORDER BY T1.ShopOperTp;
ShopOperTp OrdCnt
---------- ------
DIST 2
DRCT 5
FLAG 4
조인과 GROUP BY가 필요한 데이터 집합을 얻기 위해 SQL을 두 번에 나누어서 작성했다. 조인과 GROUP BY가 아직 익숙하지 않다면 이처럼 나누어서 작성하기 바란다. 그리고 두 테이블을 조인해 GROUP BY 처리한다고 생각하기 보다는 두 테이블을 조인해서 데이터 집합을 만들고, 만들어진 하나의 데이터 집합에 대해 GROUP BY를 처리한다고 생각하기 바란다. 조금 더 쉽게 조인과 GROUP BY를 혼합해서 사용할 수 있을 것이다.

지금 작성한 SQL에 따라 데이터 집합이 변해가는 과정을 표현해보면 다음과 같다.
