SQL

SQL 문법 정리 : 집계 데이터(GROUP BY, HAVING,GROUPING SET,ROLLUP, CUBE)

Nova 2021. 2. 17. 17:38

SQL 문법 정리 : 기초 집계 데이터(GROUP BY,HAVING,GROUPING SET,ROLLUP, CUBE)

 

GROUP BY

SELECT문에서 반환된 행을 그룹으로 나눈다.

각 그룹에 대한 합계, 평균, 카운트 등을 계산할 수 있다.

SELECT

        COLUMN_1

       ,집계함수(COLUMN_2)

  FROM

          TABLE_NAME

GROUP BY COLUMN_1

;

(#GROUP BY 절은 FROM 또는 WHERE절 바로 뒤에 나타나야 함)

(#중복제거된 유일한 COLUMN_1 값이 나옴)

 

SELECT 

         DISTINCT COLUMN_1

   FROM 

          TABLE_NAME

(#GRUOP BY = DISTINCT 결과값)

     

*거래액이 가장 많은 고객순으로 출력

SELECT

        CUSTOMER_ID

       ,SUM(AMOUNT) AS AMOUNT_SUM

 FROM

        PAYMENT

GROUP BY CUSTOMER_ID

ORDER BY SUM(AMOUNT) DESC;

 

SELECT

        CUSTOMER_ID

       ,SUM(AMOUNT) AS AMOUNT_SUM

 FROM

        PAYMENT

GROUP BY CUSTOMER_ID

ORDER BY AMOUNT_SUM DESC;

 

SELECT * FROM CUSTOMER WHERE CUSTOMER_ID = 148;

 

HAVING절

GROUP BY절과 함께 HAVING절을 사용하여 GROUP BY의 결과를 특정 조건으로 필터링 하는 기능을한다.

 

SELECT

          CLOUMN 1

         ,집계함수(COLUMN_2)

 FROM

         TABLE_NAME

GROUP BY COLUMN_1

    HAVING 조건식;

(# HAVING절은 GROUP BY 절에 의해 생성된 그룹행의 조건을 설정한다.)

(# 반면에 WHERE절은 GROUP BY절이 적용되기 전에 개별 행의 조건을 설정한다.)

 

GROUPING SET

GROUPING SET절을 사용하여 여러개의 UNION ALL을 이용한 SQL과 같은 결과를 도출할 수 있다.

GROUPING SET절을 이용하면 한번에 다양한 기준의 컬럼 조합으로 집계를 구할 수 있다.

 

SELECT

         C1

        ,C2

        ,집계함수(C3)

   FROM

         TABLE_NAME

GROUP BY 

GRUOPING SETS

(

  (C1,C2)

 ,(C1)

 ,(C2)

 ,(  )

);

 

SELECT 

        BRAND

       ,SEGMENT

       ,SUM(QUANTITY)

FROM

       SALES

GROUP BY

GROUPING SETS

(

 (BRAND,SEGMENT)

, (BRAND)

,(SEGMENT)

,()

);

(#BRAND, SEGMENT컬럼기준으로 합계를 구한다)

(#BRAND 컬럼 기준으로 합계를 구한다.)

(#SEGMENT 컬럼 기준으로 합계를 구한다.)

(테이블 전체를 기준으로 합계를 구한다)

 

GROUPING SET절 - GROUPING 함수

GROUPING 함수를 사용하면 해당 컬럼이 집계에 사용되었으면 0

그렇지 않으면 1을 리턴한다

 

SELECT

        GROUPING(BRAND) GROUP_BRAND

       , GROUPING(SEGMENT) GROUPING_SEGMENT

       , SUM(QUANTITY)

FROM

       SALES

GROUP BY

GROUPING SETS

(

 (BRAND,SEGMENT)

, (BRAND)

,(SEGMENT)

,()

);

 

ROLL UP

지정된 GROUPING 컬럼의 소계를 생성하는데 사용된다. 간단한 문법으로 다양한 소계를 출렬할 수 있다.

SELECT

         C1,C2,C3

        ,집계함수(C4)

  FROM TABLE_NAME

GROUP BY

ROLLUP(C1,C2,C3);

(#소계를 생성할 컬럼을 지정한다. 컬럼 지정 순서에 따라 결과값이 달라질수 있다.)

(#제일 앞에 놓인 것에 소계를 구함)

 

SELECT

         C1,C2,C3

        ,집계함수(C4)

  FROM TABLE_NAME

GROUP BY

ROLLUP(C1,C3);

(#특정 컬럼은 제외한 부분적인 ROLLUP도 가능하다)

 

ROLLUP - 부분ROLLUP

SELECT

         SEGMENT

        ,BRAND

        ,SUM(QUANTITY)

  FROM

          SALES

GROUP BY SEGMENT,

ROLLUP  (BRAND)

ORDER BY

             SEGMENT, BRAND;

(#부분 ROLLUP시 전체 합계는 구하지 않는다)

 

CUBE

지정된 GROUPING컬럼의 다차원 소계를 생성하는데 사용된다.

간단한 문법으로 다차원 소계를 출력할 수 있다.

SELECT

          C1,C2,C3

 FROM TABLE_NAME

GROUP BY

CUBE (C1,C2,C3);

(#CUBE절에서 다차원 소계를  할 열을 지정한다.

(지정한 그룹의 모든 경우에 수에 대한 소계와 총계를 구한다)

 

SELECT

         C1,C2,C3

  FROM TABLE_NAME

GROUP BY C1,

CUBE(C2,C3); 특정 컬럼만 분리하여 CUBE지정을 할수 있다.

 

*CUBE(C1,C2,C3)

GROUPING SETS(

(C1,C2,C3),

(C1,C2),

(C1,C3),

(C2,C3),

(C1)

(C2),

(C3)

()

)

 

(# CUBE절 내 인자의 개수가 3개이면 2의3승의 소계가 발생하게 된다.)

(# 즉,8개의 소계가 발생한다.(2의N승 = 소계의 수)