Group by 와 집계 함수(Aggregate Function) #
Group by절 #
- Group by 절에 기술된 컬럼 값(또는 가공 컬럼값)으로 그룹화 한 뒤 집계(Aggregation) 함수와 함께 사용되어 그룹화된 집계 정보를 제공
- Group by 절에 기술된 컬럼 값으로 반드시 1의 집합을 가지게 됨
- Select 절에는 Group by 절에 기술된 컬럼(또는 가공 컬럼)과 집계 함수만 사용될 수 있음
- Null을 계산하지 않음
case~when 사용한 pivoting #
- Group by 시 행 레벨로 만들어진 데이터를 열 레벨로 전환할 때 Aggregate와 case when을 결합하여 사용
-- DEPTNO로 GROUP BY하고 JOB으로 PIVOTING
SELECT SUM(CASE WHEN JOB = 'SALESMAN' THEN SAL END) AS SALES_SUM
, SUM(CASE WHEN JOB = 'MANAGER' THEN SAL END) AS MANAGER_SUM
, SUM(CASE WHEN JOB = 'ANALYST' THEN SAL END) AS ANALYST_SUM
, SUM(CASE WHEN JOB = 'CLERK' THEN SAL END) AS CLERK_SUM
, SUM(CASE WHEN JOB = 'PRESIDENT' THEN SAL END) AS PRESIDENT_SUM
FROM HR.EMP;
count 집계함수 사용시 주의할점 #
- GROUP BY PIVOTING시 조건에 따른 건수 계산 유형(COUNT CASE WHEN THEN 1 ELSE NULL END)
SELECT DEPTNO, COUNT(*) AS CNT
, COUNT(CASE WHEN JOB = 'SALESMAN' THEN 1 END) AS SALES_CNT
, COUNT(CASE WHEN JOB = 'MANAGER' THEN 1 END) AS MANAGER_CNT
, COUNT(CASE WHEN JOB = 'ANALYST' THEN 1 END) AS ANALYST_CNT
, COUNT(CASE WHEN JOB = 'CLERK' THEN 1 END) AS CLERK_CNT
, COUNT(CASE WHEN JOB = 'PRESIDENT' THEN 1 END) AS PRESIDENT_CNT
FROM HR.EMP
GROUP BY DEPTNO;
잘못된 사례
- count는 1이라해서 1건을 세는게 아니라, 1이든 0이든 세는거임 !!!! null 이여야 안센다!
-- GROUP BY PIVOTING시 조건에 따른 건수 계산 시 잘못된 사례(COUNT CASE WHEN THEN 1 ELSE NULL END)
SELECT DEPTNO, COUNT(*) AS CNT
, COUNT(CASE WHEN JOB = 'SALESMAN' THEN 1 ELSE 0 END) AS SALES_CNT
, COUNT(CASE WHEN JOB = 'MANAGER' THEN 1 ELSE 0 END) AS MANAGER_CNT
, COUNT(CASE WHEN JOB = 'ANALYST' THEN 1 ELSE 0 END) AS ANALYST_CNT
, COUNT(CASE WHEN JOB = 'CLERK' THEN 1 ELSE 0 END) AS CLERK_CNT
, COUNT(CASE WHEN JOB = 'PRESIDENT' THEN 1 ELSE 0 END) AS PRESIDENT_CNT
FROM HR.EMP
GROUP BY DEPTNO;
Rollup vs Cube #
- rollup, cube는 group by와 함께 사용된다.
- grup by절에 사용되는 컬럼들에 대해서 추가적인 group by를 수행한다.
- rollup : 계층적인 방식으로 group by 추가 수행
- Group by 시 Rollup을 함께 사용하면 Rollup에 적용된 컬럼의 순서대로 계층적인 Group by 를 추가적으로 수행
- Group by 절의 나열된 컬럼수가 N개 이면 Group by는
N+1
회 수행
- cube : group by절에 기재된 컬럼들의 가능한 combination으로 group by 수행
- Group by 시 Cube를 함께 사용하면 Cube에 나열된 컬럼들의 가능한 결합으로 Group by 수행
- Group by 절의 나열된 컬럼수가 N개 이면 Group by는
2의 n제곱
수행