본문 바로가기
데이터 분석/SQL

3차 QCC review

by engwoon 2025. 1. 10.

목차

     

    ✏️ 1번 - 첫 주문 고객 연도별 매출 조회

    문제

    “2011년 12월”에 첫 주문을 한 고객들의 연도별 매출을 조회

    조건)고객ID 기준 오름차순, 연도 기준 오름차순 정렬

     

    출력 결과

    • 고객 ID (`customerid`)
    • 고객 이름 (`customer_name`) -> firstname, lastname 결합해서 만들기
    • 연도 (`year`)
    • 총 거래액 = GMV (`gmv`) -> unitprice * orderqty

     

    풀이

    with sub as (
    SELECT c.customerid,
    		concat(firstname, ' ', lastname) customer_name
    from customer c join sales_order so on c.customerid = so.customerid
    group by 1,2
    having date_format(min(so.orderdate), '%Y-%m') = '2011-12'
    ) -- 2011/12 첫주문 한 고객 id,name 필터링 
    SELECT s.customerid,
    		s.customer_name,
    		year(so.orderdate) year,
    		sum(unitprice*orderqty) GMV
    from sub s left join sales_order so on s.customerid=so.customerid 
    group by 1,2,3
    order by 1,3;

     

    1. with sub절 : `2011/12`에 첫 주문을 한 `고객 id`, `name`을 필터링

    • 12월에 '첫 주문'을 한 고객이니까 min(so.orderdate)
    • group by 해놓은 고객 정보에서 날짜 조건(12월 첫 주문) 걸어야 하니까 having

    2. sub, sales_order 조인

    • `customerid`, `customer_name`, `year`, `GMV` 출력
    • 집계함수 빼고 group by 1,2,3 
    • order by customerid, year

     


    ✏️ 2번 - 고객별 연평균 총 거래액 집계

    문제

    2011년 12월에 첫 주문을 한 각 고객의 첫 주문과 마지막 주문 사이의 기간을 기준으로,

    해당 기간 동안의 **연평균 총거래액(GMV)**을 계산(소수점 2째자리까지)

    조건) 결과는 고객 ID(customerid) 기준으로 오름차순으로 정렬

     

    출력 결과

    • 고객 ID (`customerid`)
    • 고객 이름 (`customer_name`) -> firstname, lastname 결합해서 만들기
    • 연평균 매출 (`avg_yearly_gmv`) -> 소수점 둘째자리

     

    풀이

    with sub as(
    SELECT c.customerid,
    		concat(firstname, ' ', lastname) customer_name
    from customer c join sales_order so on c.customerid = so.customerid
    group by 1,2
    having date_format(min(so.orderdate), '%Y-%m') = '2011-12'
    ), -- 2011/12 첫주문 한 고객 id,name 필터링 
    sub2 as (
    SELECT s.customerid,
    		s.customer_name,
    		year(so.orderdate) year, -- 주문연도만 뽑기 
    		sum(so.unitprice*so.orderqty) gmv -- 고객의 연도별 GMV 
    from sub s left join sales_order so on s.customerid = so.customerid
    group by 1,2,3
    )
    SELECT customerid,
    		customer_name,
    		round(sum(gmv) / (max(year) - min(year) +1), 2) avg_yearly_gmv 
    from sub2
    group by 1,2
    order by 1;

     

    1. with sub절 : `2011/12`에 첫 주문을 한 `고객 id`, `name`을 필터링

    •  1번 문제와 동일한 쿼리

    2. sub2절 : 각 고객별 주문 `year`, 각 고객의 연도별 `gmv` 를 필터링 

    •  12월에 첫 주문을 한 고객 리스트 뽑고,
    •  각 `고객별 주문 연도`와 `연도별 gmv`를 출력한다.
    •  한 사람당 첫주문, 마지막 주문, 연도별 gmv 알 수 있음.

    3. 마지막 쿼리에서 : 연평균 gmv 계산

    •  `sum(gmv)` 를 `max(year) - min(year)+1`, 즉 기간으로 나눠줌 = 연평균 gmv

    ✏️ 3번 - 고객별 최대 주문 수량 연도와 주문 수량 집계

    문제

    2011년 12월에 첫 주문을 한 고객 대상으로

    1. 고객별 각 연도에서의 주문 수량을 집계하고,

    2. 최대 주문 수량과 그 최대 주문 수량을 발생시킨 연도 찾기

    조건) a. 최대 주문 수량이 같은 연도가 있다면, 가장 최근 연도를 출력

             b. 고객 ID 기준으로 오름차순으로 정렬

     

    출력 결과

    • 고객 ID (`customerid`)
    • 고객 이름 (`customer_name`) -> firstname, lastname 결합해서 만들기
    • 최대 주문 수량 발생 연도 (`max_qty_year`)
    • 최대 주문 수량 (`max_total_qty`)

     

    풀이

    with sub as(
    SELECT c.customerid,
    concat(firstname, ' ', lastname) customer_name
    from customer c join sales_order so on c.customerid = so.customerid
    group by 1,2
    having date_format(min(so.orderdate), '%Y-%m') = '2011-12'
    ), -- 2011/12 첫주문 한 고객 id,name 필터링 
    sub2 as (
    SELECT s.customerid,
    s.customer_name,
    year(so.orderdate) year, -- 주문발생연도
    sum(so.orderqty) total_qty, -- 총 주문수량
    rank() over (partition by s.customerid order by sum(so.orderqty) desc, year(so.orderdate) desc) as qty_rank  
    from sub s left join sales_order so on s.customerid = so.customerid 
    group by 1,2,3
    ) 
    SELECT customerid,
    		customer_name,
    		year as max_qty_year,
    		total_qty as max_total_qty
    from sub2
    where qty_rank = 1 --주문수량이 최대인 경우 필터링
    order by 1;

     

    1. with sub절 : `2011/12`에 첫 주문을 한 `고객 id`, `name`을 필터링

    • 1번 문제와 동일한 쿼리

    2. sub2절 : 고객정보(id, name), 주문발생연도, 총 주문수량 필터링 + rank()로 주문수량 순위 매기기

    • 고객 정보, 고객별 주문 발생시킨 연도 출력 -> year(so.orderdate) year
    • 고객별 총 주문 수량 출력 -> sum(so.orderqty) total_qty
    • 각 고객별 주문 발생 연도와 연도별 총 주문수량 확인.
    • 이제 total_qty 별로 순위를 매겨서 최대 주문수량이 발생한 연도 확인해야함.
    • rank() ~  -> 고객id 별 총 주문수량 순위 매기기, 이때 총 주문수량이 같다면 최근연도 출력하기 (year desc)

    고객별 주문 발생연도, 총 주문수량, 주문수량 순위 알 수 있음.

     

      3. 마지막 쿼리에서 : `최대 주문이 발생한 year`와 `total_qty`을 집계

    • where qty_rankk = 1 -> 주문수량이 최대인 경우만 필터링

     

     

    '데이터 분석 > SQL' 카테고리의 다른 글

    SQL) 문자열 길이 출력 함수 / LENGTH, CHAR_LENGTH  (0) 2025.01.07
    SQL) 재귀 쿼리로 반복문 만들기 / WITH RECURSIVE  (1) 2024.12.26
    2차 QCC review  (1) 2024.12.20
    1차 QCC review  (0) 2024.12.13
    SQL) 서브쿼리 문제  (0) 2024.12.10