1. 쇼핑몰의 일일 매출액
SELECT
DATE(o.order_purchase_timestamp) AS dt,
ROUND(SUM(p.payment_value), 2) AS revenue_daily
FROM olist_orders_dataset AS o
JOIN olist_order_payments_dataset AS p
USING (order_id)
WHERE o.order_purchase_timestamp >= '2018-01-01'
GROUP BY dt
ORDER BY dt;
POINT!
USING : 두 테이블에 완전히 동일한 컬럼명이 있고, 그 컬럼으로만 조인할 때 간결하게 사용 가능
- ON을 쓰면 결과 테이블에 o.order_id와 p.order_id 두 컬럼이 둘 다 남는다
- USING을 쓰면 order_id가 한 번만 표시된다
👉 같은 이름이므로 MySQL이 자동으로 병합해줍니다.
2. 점검이 필요한 자전거 찾기
SELECT bike_id
FROM rental_history
WHERE DATE_FORMAT(rent_at,'%Y-%m') = '2021-01'
GROUP BY bike_id
HAVING SUM(distance) >= 50000
3. 레스토랑의 대목
SELECT *
FROM tips
WHERE day IN (
SELECT
day
FROM tips
GROUP BY day
HAVING SUM(total_bill) >= 1500
)
4. 레스토랑의 요일별 VIP
WITH ranked AS (
SELECT
*,
RANK() OVER (PARTITION BY day ORDER BY total_bill DESC) AS rn
FROM tips
)
SELECT total_bill, tip, sex, smoker, day, time, size
FROM ranked
WHERE rn = 1
ORDER BY day;
POINT!
MySQL에서는 * EXCEPT(col) 이라는 문법이 없기 때문에 최종 결과에 나올 컬럼을 직접 나열해야한다
요일별 가장 높은 금액의 결제 내역을 출력하는 조건
👉 가장 높은 금액이 동일할 수 있다는 가정으로 정보의 유실을 막기위해 RANK 함수를 사용했습니다.
'코딩 테스트 > 02. SQL' 카테고리의 다른 글
| [solvesql_Lv2] 제목이 모음으로 끝나지 않는 영화 (0) | 2025.10.12 |
|---|---|
| [solvesql_Lv2] 다음날 서울숲의 미세먼지 농도 나쁨 (0) | 2025.10.11 |
| [프로그래머스]Oracle SQL_7(Lv4) (0) | 2025.10.04 |
| [프로그래머스]Oracle SQL_6(Lv4)/UNION ALL과 CONNECT BY (0) | 2025.10.03 |
| [프로그래머스]Oracle SQL_5(Lv4) (0) | 2025.10.02 |