Open danbi5228 opened 1 year ago
특정 칼럼의 값으로 레코드를 그루핑하고, 그룹별로 집계된 결과를 하나의 레코드로 조회할 때 사용한다
그루핑된 그룹별로 소계를 가져올 수 있는 ROLLUP 기능
GROUP BY ... ROLLUP
형태로 사용
단순히 최종 합만 가져오는 것이 아니라 GROUP BY
에 사용된 칼럼의 개수에 따라 소계의 레벨이 달라짐
엑셀의 피벗 테이블과 동일한 기능으로 생각하면 됨
WITH ROLLUP
과 함께 사용된 GROUP BY
쿼리의 결과는 그룹별로 소계를 출력하는 레코드가 추가되어 표시됨
97p dept_no
칼럼 1개만 있을 때는 소계가 1개만 존재하고 dept_no
칼럼값은 NULL
로 표기
first_name, last_name 칼럼 2개로 늘어나는 예제는 소계가 2단계로 표시
first_name = Aamer 소계
전체 소계
이런식으로 표시됨
8.0 버전부터는 그룹 레코드에 표시되는 NULL을 사용자가 변경할 수 있다
GROUPING()
함수를 통해서 변경SELECT ...
IF(GROUPING(first_name), 'ALL first_name', first_name) AS first_name,
...
GROUP BY
나 집합 함수를 통해 레코드를 그루핑할 수 있지만
하나의 레코드를 여러 개의 칼럼으로 나누거나 변환하는 SQL 문법은 없음
SUM()
, COUNT()
같은 집합 함수와 CASE WHEN ... END
구문을 이용해 레코드를 칼럼으로 변환하거나
하나의 칼럼을 조건으로 구분해서 2개 이상의 칼럼으로 변환하는 것은 가능
99p와 같이 쿼리를 작성하면
SELECT dept_no, COUNT(*) AS emp_count
FROM dept_emp
GROUP BY dept_no;
흔히 봤듯이 dept_no
칼럼의 값 별로 개수가 여러 레코드로 출력된다
레포팅 도구나 OLAP 같은 도구에서 레코드를 칼럼으로 변환해야 할 수도 있다
100p 결과처럼 부서 정보와 부서별 사원의 수를 레코드(가로)가 아닌 칼럼(세로)별로 변환됨
변환의 원리는
부서별로 9개의 레코드를 한 건의 레코드로 만들어야 하기 때문에
GROUP BY된 결과를 서브쿼리로 만든 후 SUM()
함수 적용
레코드를 칼럼으로 변환하는 작업은 위에 처럼 COUNT, MIN, MAX, AVG, SUM 등의 집합 함수를 사용하면 됨
SELECT dept_no, COUNT(*) AS emp_count
FROM dept_emp
GROUP BY dept_no;
앞에 99p 쿼리인데 단순히 부서별로 전체 사원의 수만 조회하는 쿼리였다
SELECT de.dept_no,
SUM(CASE WHEN e.hire_date BETWEEN '1980-01-01' AND '1989-12-31' THEN 1 ELSE 0 END) AS CNT_1980
...
...
COUNT(*) AS cnt_total
FROM dept_emp de, employees e
WHERE e.emp_no=de.emp_no
GROUP BY de.dept_no;
해당 쿼리 처럼 SUM(CASE WHEN...)
문장을 통해 소그룹을 특정 조건으로 나눠서 사원의 수를 구하는 용도로 사용할 수 있고 결과는 101p 처럼 1980년도, 1990년도, 2000년도의 부서별 입사 사원의 수를 볼 수 있다
dept_emp
테이블 만으로는 사원의 입사 일자를 알 수 없으므로 employees
테이블을 조인했고
조인된 결과를 dept_emp
테이블의 dept_no
별로 GROUP BY
를 실행 했다
그루핑된 부서별 사원의 정보에서 CASE WHEN
으로 사원의 입사 연도를 구분해서 연도별로 합계를 실행하면 원하는 결과를 얻을 수 있다
위와 같은 SQL 문장으로 상당히 많은 프로그램 코드를 줄일 수 있고 앞서나온 WITH ROLLUP
기능을 함께 사용한다면 더 유용한 결과를 만들어 낼 수 있다고 책에 나와있는데
GROUP BY 내용 매우 유익해보이고 실제로도 많이 쓸 듯?
SELECT first_name, last_name .. ORDER BY 2
(= ORDER BY last_name)SELECT first_name, last_name .. ORDER BY "last_name"
SELECT * FROM salaries ORDER BY COS(salary)
다음 스터디
2023-02-01 pm 10:30 수요일
정리 범위