[Aggregation&Subquery] 3. GROUP BY()로 데이터 그룹화하기
반갑습니다!
저번 포스트에서 count(), sum(), avg(), min(), max() 등의 집계함수에 대해 살펴보았습니다 ^^
이번 포스트에서는 GROUP BY를 이용해서 특정 데이터들을 그룹화해보겠습니다
이번에도 동일한 샘플 데이터를 사용합니다
편의를 위해서 하단에 파일 첨부하겠습니다 ^^!
customers 테이블과 orders 테이블을 JOIN 연산하여 합쳤습니다
동일 유저가 여러 주문 정보를 가지고 있으므로,
위와 같이 특정 컬럼의 값이 중복되는 것을 확인할 수 있겠습니다 ^^
그럼 한 유저가 여러 주문 정보를 가지고 있는 상황 속에서
유저의 이름이 고유하도록 그룹화해보도록 하겠습니다
GROUP BY 키워드를 이용해서 그룹화를 진행했습니다
어떤 컬럼을 기준 삼을건지 키워드 뒤에 지정해주시면 됩니다
저는 customers 테이블의 id 값을 기준으로 정했습니다 ^^
바로 앞전 예시 이미지와 비교해보면,
한 유저에 대해 하나의 주문 정보만 출력되어 있는 것을 볼 수가 있는데요
나머지 정보들이 사라진 것은 아닙니다!
그룹화 되어 있기 때문에 동일 유저에 대한 여러 주문 정보 중에서
최상단의 데이터 하나를 대표적으로 출력하여 조회된 것이죠 ^^
그럼 나머지 정보들이 살아있는지 어떻게 확인할 수 있을까요?
앞전 포스트에서 굳이 설명만 첨부하지 않았을 뿐, 이미 사용했었는데요
이번에는 그룹화 된 데이터의 존재성에 대해서 알아보기 위해서
앞서 살펴본 집계 함수를 이용해보겠습니다 ^^!
count() 함수를 사용했습니다
파라미터로는 customers 테이블의 id 컬럼을 넣어줬씁니다
그룹화하기 이전 전체 데이터 조회시 출력 결과를 보면
동일한 id 값이 여러번 중복되는 것을 알 수 있습니다
그룹화 된 후에도 그 데이터들이 살아있으니까,
각 id마다 해당 값이 몇 번 반복되는지 counting을 해주면
해당 유저가 총 몇 번 주문을 했는지(= 주문 정보가 남았는지)
알 수가 있겠죠? ^^
그럼 이번에는 sum()과 avg() 함수를 이용해서
amount 컬럼의 값에 대해서도 한 번 집계해볼까요?
구조는 동일합니다
다만 아까는 count() 함수를 적용한 자리에 sum() 함수를 사용하였고,
파라미터로는 amount 컬럼을 넣어줬습니다 ^^
보시면 amount 컬럼의 값과 amount_sum 컬럼의 값이 상이한 것을 확인할 수 있죠!
그룹화 적용시 출력 결과에만 표시되어 있지 않을 뿐,
데이터들이 다 살아있기 때문입니다 ^^
avg() 함수를 적용해서 amount 정보에 대해 평균값을 구해 병기(幷記)한 화면입니다 ^^
SQL문 자체만으로는 앞전 포스트와 중복되는 부분이 많이 있습니다 ^^
GROUP BY 키워드를 이용한 그룹화 자체가 필연적으로 여러 집계함수들과 많이 쓰이기 때문에
예시를 준비하다보니 불가피한 부분이었는데요 ^^
이전과 이번 포스트를 통해서 해당 SQL문에 대해서 조금은 익숙해지셨을거라 생각합니다
다음 포스트에서는 HAVING 키워드에 알아보겠는데요
SQL문 처리 순서상 WHERE 구문이 GROUP BY 구문보다 앞서기 때문에
그룹화 이후에 특정 조건을 지정하여 조건 조회를 하려면
WHERE 구문이 아니라 HAVING 키워드를 적용해야 합니다 ^^
읽어주셔서 감사드리며,
다음 포스트에서 찾아뵙겠습니다 ^^!