📌 오늘 학습 키워드
- GROUP BY
- SUBQUERY
📖 오늘 학습한 내용을 나만의 언어로 정리하기
Q. marketer_payments 테이블에서 각 결제 방식(payment_type)별 결제 금액의 합계와 해당 결제 방식이 전체 결제 금액에서 차지하는 비율을 계산하세요.
SELECT payment_type,
count(*) cnt_payments,
sum(payment_value) sum_payment,
ROUND(sum(payment_value)/(SELECT sum(payment_value) FROM marketer_payments)*100 ,2) payment_ratio
FROM marketer_payments
GROUP BY payment_type
1️⃣ GROUP BY
GROUP BY를 사용해서 그룹화해 놓았으면 집계 함수(sum, avg, max, min)가 쓰여야 한다.
위의 문제는 결제 방식 별 결제 금액의 합계와, 전체 결제 금액을 구해야 한다.
따라서 결제 방식(payment_type)별로 GROUP BY 구문을 만들었다.
여기서 문제는 payment_type 별로 group by를 해놓았기 때문에 전체 결제 금액을 구할 수 없다.
이 때는 서브쿼리를 작성해주어야 한다.
2️⃣ SUBQUERY
해당 결제 방식이 전체 결제 금액에서 차지하는 비율을 구하는 방법은 다음과 같다.
결제 방식 별 결제 금액 / 총 결제 금액 * 100
총 결제 금액을 구하는 서브 쿼리는 다음과 같이 작성할 수 있다.
SELECT sum(payment_value)
FROM marketer_payments
❌ 학습하며 겪었던 문제점 & 에러
그동안 문제를 풀 때 '전체에서 해당 그룹이 차지하는 비율' 을 구하는 부분에서 항상 윈도우 함수인 OVER()을 사용했었다. 하지만 그 함수는 MySQL에 한정된 함수였고, 튜터님께서는 공통적으로 쓰이는 함수를 사용하는게 좋다고 말씀해주셨다. 그래서 그동안 잘 알지 못해서 사용을 피했던 GROUP BY 함수의 원리에 대해 완벽히 이해하는 시간을 가졌다.
GROUP BY는 특정 그룹 별로 집계를 해야하는 상황에서 사용한다. 예를 들어 결제 수단 별 결제 금액, 고객 아이디 별 주문 횟수 등등. 그룹화를 했기 때문에 전체합이나, 전체의 평균을 구할 수 없다. 그룹화를 한 그룹별로 집계가 되기 때문이다. 하지만 간혹 전체에서 차지하는 특정 그룹의 비율을 구해야하는 경우가 나타난다. 그 때는 SUBQUERY를 사용하면 된다.
우리가 필요한 값을 구하기 위한 쿼리를 따로 작성하고, 필요한 부분에 넣어주면 해결된다. 먼저 필요한 값을 한국어로 작성해 비워둔 다음, 서브쿼리를 따로 만들어서 원하는 값이 나오는지 확인하고 넣어주는 방식으로 접근했다. 그렇게 하니 윈도우 함수를 쓰지 않고도 계산할 수 있었다.
🎯 내일 학습할 내용
내일은 SQL 라이브 세션 이후 풀어야 하는 과제를 열심히 완수하려고 한다.
'[스파르타 코딩클럽] 부트캠프' 카테고리의 다른 글
MySQL Group by 이해하기 | 25.05.21 (수) (0) | 2025.05.21 |
---|---|
MySQL Group by, Subquery, Having | 내일배움캠프 25.05.20 (화) TIL (0) | 2025.05.20 |
비전공자의 파이썬 독학 : 기본 개념 (변수, 문자열, 리스트, 딕셔너리, 반복문, 함수, f-string) | 내일배움캠프 25.05.12 TIL (0) | 2025.05.12 |
[내일배움캠프 사전캠프] WIL 2025.05.09 (금) (0) | 2025.05.09 |
[내일배움사전캠프] 25.05.08 (목) (0) | 2025.05.08 |