Growth Marketing/Job Preparation

마케터 지망생의 데이터 분석 정복기 ③|SQL로 데이터 기반 성장 전략 만들기 !

pamsyra 2026. 4. 26. 09:48

3번째 과제는 SQL 

실무사례로 풀어보는 SQL 쿼리작성인데요

복습입니다 복습

 

목표는 "뷰티 기업인 GlowCos의 리텐션 분석 "

Attitude는 "quick quick" 

 

할 일 정리~

1. 현황 파악 및 마케팅 타겟 설정 : 기초진단

2. 마케팅 전략 제시 : 수익 최적화 및 고객 유지


[SQL 작성 순서]

SQL 실습을 하는데 항상 헷갈리는 부분이 작성순서여서 다시 한번 정리하고 들어갑니다

SQL쿼리 작성 순서


1. 현황 파악 및 마케팅 타겟 설정

  상황
- 역할 : 온라인 편집숍 'UK 스토어'의 데이터 분석가

- 문제 : 현재 우리 회사는 글로벌 확장을 준비 중이며, 최근 늘어난 환불과 정체된 매출 문제를 해결해야 함.
- 목표 : 경영진이 당신에게 데이터를 통해 현황을 진단하고 해결책을 제시하라는 미션을 줬음

 

[기초 진단]

기초 진단 리스트에서 헷갈렸던 부분

 

[심화 진단]

심화 진단 리스트에서 헷갈렸던 부분

- 서브쿼리 사용

- 다중 서브쿼리 사용시 WITH 구문으로 사용하는 법

저가상품이 훨씬 많고 많이 팔리네
count(*)로 세보기, 동시에는 출력 오류남

 

 

 

 

count(order_id)로 음수 개수 확인후에 조건 걸어주고
검수방법 : where 조건 / order by asc
 

숫자로 컬럼 지정도 가

 

 

with 구문 - 해설 참고 - 서브쿼리 뽑을 때 편하고 쉬움


-- 14. 총 구매액이 60,000파운드 이상인 'VVIP 고객' 리스트를 만드세요.
-- 3개 테이블 조인 : customers - orders['customer_id']['order_id'] order_items
-- 출력할 컬럼 : customer_id, 고객별 전체 주문금액
-- 제외할 항목 : 환불한 경우 order_id not like "C%"

-- 1) 주문건별 구매액 조회할 수 있는 테이블 만들기 -- 서브쿼리로
-- 2) 고객별 주문건 집계해서 -> 6만파운드 이상 구매한 경우만 조회하기

SELECT 
  order_id,
  SUM(price*quantity) as 주문건당_결제액 -- 쌍따옴표해서 띄어쓰기해도 되지만 나중에 오류
FROM order_items
WHERE order_id not like "C%"
GROUP BY 1
-- 1) 주문건별 구매액 조회할 수 있는 테이블 만들기 -- 서브쿼리로
-- 2) 고객별 주문건 집계해서 -> 6만파운드 이상 구매한 경우만 조회하기
SELECT
od.customer_id
, SUM(order_amount.주문건당_결제액) as 고객별_결제액
FROM orders as od
LEFT JOIN (SELECT 
            order_id,
            SUM(price*quantity) as 주문건당_결제액 -- 쌍따옴표해서 띄어쓰기해도 되지만 나중에 오류
          FROM order_items
          WHERE order_id not like "C%"
          GROUP BY 1)  as order_amount
on od.order_id = order_amount.order_id

GROUP BY 1
HAVING 고객별_결제액 > 60000

1단계 서브쿼리 생성 -> 2단계 서브쿼리 활용해서 쿼리 작성

- WITH 쓰면 별칭 먼저 작성해주기

-- WITH 이용해서 서브쿼리 정리하기
WITH
	order_amount as (SELECT 
                order_id,
                SUM(price*quantity) as 주문건당_결제액 
          FROM order_items
          WHERE order_id not like "C%"
          GROUP BY 1) 
SELECT
    od.customer_id
    , SUM(order_amount.주문건당_결제액) as 고객별_결제액
FROM orders as od

    LEFT JOIN order_amount
    on od.order_id = order_amount.order_id

GROUP BY 1
HAVING 고객별_결제액 > 60000

 

- orders와 order_items 중에 order_items가 더 행이 많다.

- 두 테이블을 join하면 order_items만큼 행이 증가하기에 연산처리 속도가 더 오래걸리게 됨

- 이런 비효율적인 상황을 방지하려면, 바로 Inner join말고 Left join을 써서 연산을 수월하게 하는 것이 좋음

- ▶ 그대로 join넣고 연산하기 vs 서브쿼리 사용해서 연산하기


복잡해서 사망했습니다.

서브쿼리 2개

가장 안쪽에 있는 서브쿼리 맨 위쪽 with

 

아~with는

테이블 1개 만들고, 2번째 테이블 만들어서

그걸 두개를 groupby해서 뽑을거야라고 하면 with 구문 먼저 사용 가능

 

 

더보기

sql은 구해야하는 문제에 대해서 단계화하는 게 중요한 것 같다

뭐 부터 구하고, 그다음 서브쿼리로 사용해서 어떤걸로 그룹바이하고 해빙조건은 뭘 넣을건지 등등

quick quick은 무슨 내 숨이 컥컥