[SQL] GROUP BY

박경국·2022년 5월 16일
0

SQL

목록 보기
7/14
post-thumbnail

분석에서 그루핑은 정말 중요한 기능입니다. 그루핑으로 분석의 초점이 정해지기 때문입니다. SQL의 그루핑 기능은 다른 함수와 사용했을 때 더 강력한데요. 이번 포스팅에서는 그루핑 기능과 함께 사용하는 함수를 정리하겠습니다.

GROUP BY & aggregate

그루핑을 할 때 SELECT 절에는 GROUP BY에서 사용한 컬럼 혹은 agg 함수만 사용할 수 있으며, GROUP BY는 한 개 이상의 조건을 걸 수 있습니다.

SELECT job, gender, count(*), AVG(wage) FROM worker
GROUP BY job, gender;

그루핑이 어떻게 작동되는지 머리속에 그려보면 쿼리문을 작성하기 더 쉽습니다. worker라는 테이블은 job에 따라서 1차적으로 그루핑이 되고, 성별에 따라서 2차 그루핑이 됩니다. 그 다음에 count(*) 쿼리를 넣었는데요. 원래라면 전체 row에 대해 count를 해야하지만, GROUP BY가 적용된 table은 그룹 단위로 count가 작동합니다. 그루핑된 특성을 새로운 table로 생각하는 게 좋을 것 같습니다. 그 다음 직업과 성별에 따른 평균 임금이 return되면서 쿼리를 마칩니다.

HAVING

그루핑된 테이블에서 특정 값의 결과만 보고 싶을 때는 HAVING을 사용해야 합니다. WHERE을 사용하면 작동하지 않는데요. 그루핑된 테이블에서 WHERE이라는 조건문을 사용하면 '어떤 row에서 찾으면 되는데?'라는 오류가 반환됩니다.

SELECT job, gender, count(*), AVG(wage) FROM worker
GROUP BY job, gender
HAVING (job IS NOT NULL) 
AND gender = 'M';

HAVING도 이렇게 두 개 이상의 조건을 걸 수 있습니다. job이 NULL이 아니고, 성별이 남성인 데이터만 보겠다는 쿼리입니다. 앞에서 다뤘던 SUBSTRING 함수도 사용할 수 있습니다.

SELECT SUBSTRING(job, 1, 3), gender, count(*), AVG(wage) FROM worker
GROUP BY SUBSTRING(job, 1, 3), gender
HAVING (job IS NOT NULL) 
AND gender = 'M';

이렇게 하면 그냥 직업 컬럼에서 앞의 세 단어를 가지고만 그루핑을 합니다.

0개의 댓글