GROUP BY 쿼리의 규칙
- GROUP BY에 사용한 컬럼만 SELECT 할 수 있다.
- GROUP BY에서 사용하지 않은 컬럼을 SELECT 하기 위해서는 집계 함수를 사용해야 한다.
GROUP BY 에도 CASE문을 사용 할 수 있다 ! 예를들어..
특정 컬럼의 값에 따라서 그룹을 나눌 수 있다!.
GROUP BY ORD_ST,
CASE WHEN ORD_AMT >= 5000 THEN 'High Order'
WHEN ORD_AMT >= 3000 THEN 'Middle Order'
ELSE 'Low Order'
END
GROUP BY 안에서도 연산을 사용할 수 있다는게 조금 신선하게 다가온다.
집계 함수에서 GROUP BY 사용하기
SELECT TO_CHAR(ORD_DT,'YYYYMM') ORD_YM
, SUM(CASE WHEN PAY_TP = 'BANK' THEN 1 END)
...
GROUP BY TO_CHAR(T1.ORD_DT, 'YYYYMM')
★GROUP BY와 CASE를 사용해서 피벗기능 흉내내기 ★
-> 세로로 올 기준은 GROUP BY에 놓고 가로 기준은 SELECT CASE에 놓는것이 핵심인것 같다.
SELECT COUNT(CASE WHEN TO_CHAR(ORD_DT, 'YYYYMM') = '202104' THEN 'X') ORD_CNT_202104
...
FROM T_ORD
GROUP BY PAY_TP
여담이지만, SUM 할때는 CASE에서 1을 쓰고, COUNT에서는 CASE할때 X를 쓰는것은 이유가 있는것일까?
EXISTS에서도 SELECT 'X' FROM DUAM WHERE EXISTS 조건을 쓰던데..흠..
PAY_TYPE과 ORD_DT를 GROUP BY한 결과를, 인라인뷰로 사용하고,
부모쿼리에서 다시 한번 PAY_TYPE으로 GROUP BY + 각각의 ORD_DT를 MAX 집계함수를 사용해도 동일한 결과를 얻을 수 있다.
(GROUP BY에서 사용하지 않은 ORD_DT 컬럼을 표시하기위해 MAX 집계함수를 사용한게 신선하다.)
'Today I learned' 카테고리의 다른 글
2021 04 23 - sqlBooster JOIN JOIN JOIN (0) | 2021.04.23 |
---|---|
2021 04 23 - SQL Booter COUNT의 비밀 (0) | 2021.04.23 |
2021 04 16 (0) | 2021.04.16 |
2021 04 09 (0) | 2021.04.16 |
2021 04 10 - sql Antipatterns (0) | 2021.04.10 |
댓글