본문 바로가기
Today I learned

2021 04 22 - SQL Booster : GROUP BY Holic

by soheemon 2021. 4. 22.

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

댓글