SQL 기초 - 그룹화, GROUP BY

오늘 SQL 기초 수업은  그룹화에 대해서 알아보았다.

DB는 기존과 동일하게 마켓컬리 DB를 이용


그룹화란,  그룹별 데이터를 특징별로 구분하여 집계한 데이터를 맏들어서 확인 할 수 있다. 


문제 1번, 결제 테이블을 결제방법에 따라 분류 각각의 결제횟수를 조회하시오.

기준이 되는 payments 테이블만 그룹화하여 보았으면 되었는데 나는 문제를 주의깊게 보지 않아서 orders까지 조인해서 보았다.

뭐 결과는 동일하다. 

select payments.ptype, count(payments.id) from payments

inner join orders

on payments.order_id = orders.id 

group by payments.ptype 

order by payments.ptype asc ; 



문제 2번, 상품테이블 보관 타입에 따라 분류하고 각각의 상품 개수와 평균가격을 조회하시오.

이문제는 count 함수와 avg 함수 그리고 round 함수를 함께 사용함 

select ptype, count(id), round(avg(price)) from products

group by ptype

order by ptype asc ; 


문제 풀이 후 풀이과정을 보니 본 문제에서는 round 함수는 사용하지 않았다. 

사용하지 않은 경우 아래처럼 이쁘게 나오지 않아서 나는 그냥 round 함수를 추가했었다. 


문제 3. 사용자 닉네임별 배송완료 후 주문 횟수를 구하시오. 

orders 테이블과 users 테이블을 조인해서 결과 값을 구해야하는 문제였다. 

select users.nickname, count(orders.id) from orders 

inner join users

on orders.user_id = users.id  

where orders.status = 'DELIVERED'

group by users.nickname;


나는 조회조건에 배송상태를 조건으로 걸었는데 문제 풀이를 보니 join에 아래처럼 추가한내용을 확인했다.

join orders on orders.user_id = users.id and orders.stauts = 'DELIVERED'

이 차이점을 나는 아직은 모르겠다. 


추가문제  1. 상품별 총 주문횟수와 주문금액을 구하시오. 

order_details와 products 테이블을 조인하여 count, sum함수를 사용함.

select 

products.name,

count(order_details.order_id),

sum(order_details.count * products.price)

from order_details 

inner join products

on order_details.product_id = products.id

group by products.name ; 



추가문제 2. 사용자 직네임별 배송완료 주문 수와 결제 금액 조회

문제 3번에 결제 테이블을 추가해서 조회하였다. 

select users.nickname, count(orders.id), sum(payments.amount) from orders 

inner join users

on orders.user_id = users.id  

inner join payments

on orders.id = payments.order_id

where orders.status = 'DELIVERED'

group by users.nickname;




댓글