
유저별 총 주문금액을 구하는데 또 OVER를 썼다...
-- ❌ 틀림!
SUM(amount) OVER(PARTITION BY user_id) AS total_amount
-- ✅ 정답!
SUM(amount) AS total_amount
...
GROUP BY user_id
같은 실수 반복 중! 😱
"행이 줄어들어?"
| 대답 | 사용 |
|---|---|
| YES (유저별 1줄씩) | GROUP BY |
| NO (행 유지하면서 값 붙이기) | OVER(PARTITION BY) |
| id | user_id | amount |
|---|---|---|
| 1 | 100 | 15000 |
| 2 | 100 | 55000 |
| 3 | 100 | 120000 |
| 4 | 200 | 8000 |
SELECT user_id, SUM(amount) AS total
FROM orders
GROUP BY user_id
| user_id | total |
|---|---|
| 100 | 190000 |
| 200 | 8000 |
→ 3행 → 2행! (줄어듦!)
SELECT user_id, amount, SUM(amount) OVER(PARTITION BY user_id) AS total
FROM orders
| user_id | amount | total |
|---|---|---|
| 100 | 15000 | 190000 |
| 100 | 55000 | 190000 |
| 100 | 120000 | 190000 |
| 200 | 8000 | 8000 |
→ 4행 → 4행! (유지!)
| 문제 | 실수 | 정답 |
|---|---|---|
| HAVING 문제 | COUNT(*) OVER 사용 | COUNT(*) + GROUP BY |
| 모의고사 Q2 | SUM() OVER 사용 | SUM() + GROUP BY |
둘 다 "유저별 1줄" 문제인데 OVER를 써버림!
문제 읽고 이렇게 판단하자!
1. "유저별 총 금액 구하라" → 유저당 1줄? → YES → GROUP BY!
2. "각 주문에 유저 총 금액을 붙여라" → 행 유지? → YES → OVER!
| 키워드 | 행 | 사용 |
|---|---|---|
| ~별 집계 (합계, 평균, 건수) | 줄어듦 | GROUP BY |
| 순위, 이전행, 누적합 | 유지 | OVER() |
| 각 행에 집계값 붙이기 | 유지 | OVER(PARTITION BY) |
"행 줄어들어?" YES면 GROUP BY! 💪