SQL 문법 정리 : 집계 데이터(GROUP BY, HAVING,GROUPING SET,ROLLUP, CUBE)
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승 = 소계의 수)