개인공부

[개인공부] 주말 ETL 1주차 25.12.27(토)~28(일)

nom_de_plume 2025. 12. 28. 02:40

엑셀보다 쉽고 빠른 SQL 4주차

 

여러번의 연산을 한 번의 SQL문으로 수행하기 (Subquery)

- Subquery가 필요한 경우

● 여러번의 연산을 수행해야 할 때

● 조건문에 연산 결과를 사용해야 할 때

● 조건에 Query 결과를 사용하고 싶을 때

- Subquery문의 기본 구조

select column1, special_column
from
      ( /* subquery */
      select column1, column2 special_column
      from table1 )
      a
select column1, column2
from table1
where column1 = (select col1 from table2)

 

**Query 를 적기 전에 흐름을 정리해보기

  1. 어떤 테이블에서 데이터를 뽑을 것인가
  2. 어떤 컬럼을 이용할 것인가
  3. 어떤 조건을 지정해야 하는가
  4. 어떤 함수 (수식) 을 이용해야 하는가

**구문으로 만들기

  1. 어떤 테이블에서 데이터를 뽑을 것인가
  2. 어떤 컬럼을 이용할 것인가
  3. 어떤 조건을 지정해야 하는가
  4. 어떤 함수 (수식) 을 이용해야 하는가

 

# 실습 1

음식점의 평균 단가별 segmentation 을 진행하고, 그룹에 따라 수수료 연산하기

(수수료 구간 -

5000원 미만 0.05%

5000원 이상 ~ 20,000원 미만 1%

20000원 이상 ~ 30,000원 미만:2%

30000원 이상 3%)

 

답)

select

        case

              when price<5000 then 0.0005

              when price<20000 then 0.01

              when price<30000 then 0.02

              else 0.03

        end as price_segment

from sparta.food_orders

해설)

  1. 어떤 테이블에서 데이터를 뽑을 것인가 → 주문 테이블
  2. 어떤 컬럼을 이용할 것인가 → 식당 이름, 주문 금액, 주문 수량
  3. 어떤 조건을 지정해야 하는가 → X
  4. 어떤 함수 (수식) 을 이용해야 하는가 → 평균 구하는 식, 카테고리에 따라 연산, 조건문
  1. 어떤 테이블에서 데이터를 뽑을 것인가 → from food_orders
  2. 어떤 컬럼을 이용할 것인가 → restaurant_name, price, quantity
  3. 어떤 조건을 지정해야 하는가 → X
  4. 어떤 함수 (수식) 을 이용해야 하는가 → avg(price/quantity), case when, group by

select

        restaurant_name,

        price_per_plate*ratio_of_add "수수료"

from

(

select

        restaurant_name,

        case

              when price_per_plate<5000 then 0.005

              when price_per_plate between 5000 and 19999 then 0.01

              when price_per_plate between 20000 and 29999 then 0.02

              else 0.03

        end ratio_of_add,

        price_per_plate

from

(

select

        restaurant_name,

        avg(price/quantity) as price_per_plate

from food_orders

group by restaurant_name

) a

) b

 

=> Subquery문제이다.. 문제의 의도를 찾아야한다. 아무리 그래도 문제가 좀 불친절한 감이 있다. '음식점의 평균 단가별 segmentation을 진행하고' 가 Subquery문 역할을 했을 것이다.  우선 첫번째 Subquery는 음식점 이름 'restaurant_name', 단가의 평균을 연산한 평균 단가를 별명 'price_per_plate'를 food_orders 테이블에서 SELECT문으로 불러와야한다. 이를 통해 Subquery 별명 a가 완성된다. 다음으로 '그룹에 따라 수수료 연산하기' 가 두번째 Subquery를 설명한다. 문제에서 주어진 수수료 구간을 CASE문을 활용해 계산한다. Subquery 'a' 에서 불러온 컬럼들도 모두 불러와 총 3개의 컬럼을 두번째 Subquery 별명 'b' 로 불러온다. 마지막 본 Query문에서 결과를 출력한다. 앞서 계산한 수수료를 음식점 명과 함께 불러와 결과를 출력해준다.

 

# 실습 2

음식점의 지역과 평균 배달시간으로 segmentation 하기

 

답)

  1. 어떤 테이블에서 데이터를 뽑을 것인가 → 주문 테이블
  2. 어떤 컬럼을 이용할 것인가 → 식당 이름, 배달 시간, 식당 주소
  3. 어떤 조건을 지정해야 하는가 → X
  4. 어떤 함수 (수식) 을 이용해야 하는가 → 평균 구하는 식, 카테고리에 따라 연산, 조건문
  1. 어떤 테이블에서 데이터를 뽑을 것인가 → from food_orders
  2. 어떤 컬럼을 이용할 것인가 → restaurant_name, delivery_time, addr
  3. 어떤 조건을 지정해야 하는가 → X
  4. 어떤 함수 (수식) 을 이용해야 하는가 → avg(delivery_time/quantity), group by

select

        restaurant_name,

        avg_delivery_time,

        addr

from

(

select

        restaurant_name,

        avg(delivery_time/quantity) as avg_delivery_time,

        addr

from sparta.food_orders

group by restaurant_name, addr

) as a

 

해설)

  1. 어떤 테이블에서 데이터를 뽑을 것인가 → 주문 테이블
  2. 어떤 컬럼을 이용할 것인가 → 식당 이름, 주소, 배달 시간
  3. 어떤 조건을 지정해야 하는가 → X
  4. 어떤 함수 (수식) 을 이용해야 하는가 → 평균 구사는 수식, 조건문, 카테고리별 연산, 문자의 특정 부분만 추출
  1. 어떤 테이블에서 데이터를 뽑을 것인가 → from food_orders
  2. 어떤 컬럼을 이용할 것인가 → restaurant_name, addr, delivery_time
  3. 어떤 조건을 지정해야 하는가 → X
  4. 어떤 함수 (수식) 을 이용해야 하는가 → avg(delivery_time), substring(addr, 1, 2), case when, group by

select

        restaurant_name,

        sido,

        case

              when avg_time<=20 then '<=20'

              when avg_time>20 and avg_time <=30 then '20<x<=30'

              when avg_time>30 then '>30' end time_segment

from

(

select

        restaurant_name,

        substring(addr, 1, 2) sido,

        avg(delivery_time) avg_time

from food_orders

group by 1, 2

) a

 

=> 이건 진짜 너무 불친절했다. 문제만 읽고는 도저히 답을 찾을 수 없었다. 주소를 앞 2자리만 표시되게 해야했거나, 평균 배달 시간을 범위로 표현해야 했다면 문제에 표시해줬어야 했다. 이를 제외하면 사실상 문제를 잘 풀어냈다고 생각한다.

 

# 실습 3

음식 타입별 지역별 총 주문수량과 음식점 수를 연산하고, 주문수량과 음식점수 별 수수료율을 산정하기

(음식점수 5개 이상, 주문수 30개 이상 → 수수료 0.5%

 음식점수 5개 이상, 주문수 30개 미만 → 수수료 0.8%

 음식점수 5개 미만, 주문수 30개 이상 → 수수료 1%

 음식점수 5개 미만, 주문수 30개 미만 → 수수로 2%)

 

답)

  1. 어떤 테이블에서 데이터를 뽑을 것인가 → 주문 테이블
  2. 어떤 컬럼을 이용할 것인가 → 식당 이름, 음식 타입, 주문 수, 식당 수
  3. 어떤 조건을 지정해야 하는가 → X
  4. 어떤 함수 (수식) 을 이용해야 하는가 → 평균 구하는 식, 카테고리에 따라 연산, 조건문
  5. 어떤 테이블에서 데이터를 뽑을 것인가 → from food_orders
  6. 어떤 컬럼을 이용할 것인가 → restaurant_name, cuisine_type, order_id, quantity
  7. 어떤 조건을 지정해야 하는가 → X
  8. 어떤 함수 (수식) 을 이용해야 하는가 → avg(delivery_time/quantity), group by, case when

select

        restaurant_name,

        cnt_order,

        cnt_restaurant,

        CASE

                when cnt_restaurant >=5 and cnt_order >=30 then 0.005

                when cnt_restaurant >=5 and cnt_order <30 then 0.008

                when cnt_restaurant <5 and cnt_order >=30 then 0.01

                else 0.02

        END vct

from

(

select

        restaurant_name,

        cuisine_type,

        count(distinct quantity) as cnt_order,

        count(distinct order_id) as cnt_restaurant

from sparta.food_orders

group by restaurant_name, cuisine_type

) a

 

해설)

  1. 어떤 테이블에서 데이터를 뽑을 것인가 → 주문 테이블
  2. 어떤 컬럼을 이용할 것인가 → 음식 타입, 주소, 주문 수량, 식당 이름
  3. 어떤 조건을 지정해야 하는가 → X
  4. 어떤 함수 (수식) 을 이용해야 하는가 → 합계 구하는 기능, 갯수 수하는 기능
  1. 어떤 테이블에서 데이터를 뽑을 것인가 → from orders
  2. 어떤 컬럼을 이용할 것인가 → price, cuisine_type, addr
  3. 어떤 함수 (수식) 을 이용해야 하는가 → sum(quantity), count(distinct restaurant_name)

select

        cuisine_type,

        total_quantity,

        count_of_restautant,

        case

              when count_of_restautant>=5 and total_quantity>=30 then 0.005

              when count_of_restautant>=5 and total_quantity<30 then 0.008

              when count_of_restautant<5 and total_quantity>=30 then 0.01

              when count_of_restautant<5 and total_quantity<30 then 0.02 end rate

from

(

select

        cuisine_type,

        sum(quantity) total_quantity,

        count(distinct restaurant_name) count_of_restautant

from food_orders

group by 1

) a

 

=> 컬럼을 잘못 선정한 것이 문제였다고 본다. 우선 주문수량은 수량이다. 즉, COUNT가 아닌 SUM 집계연산을 사용해야 한다. 다음으로 음식점 수를 계산할 때 'order_id' 컬럼을 쓰는 것이 아니고 'restaurant_name' 컬럼을 이용해서 DISTINCT로 중복값을 제거하고 COUNT 문법을 활용해 계산해야한다. 즉, Subquery 'a' 에는 음식 타입별 지역인 'cuisine_type', 주문수량, 음식점 수 3개의 컬럼을 사용해야 한다. 본 Query문은 '음식 타입별 지역', '총 주문수량', '음식점 수', '수수료율' 컬럼이 들어가야한다.

 

# 실습 4

음식점의 총 주문수량과 주문 금액을 연산하고, 주문 수량을 기반으로 수수료 할인율 구하기

(할인조건

수량이 5개 이하 → 10%

수량이 15개 초과, 총 주문금액이 300000 이상 → 0.5%

이 외에는 일괄 1%)

 

답)

  1. 어떤 테이블에서 데이터를 뽑을 것인가 → 주문 테이블
  2. 어떤 컬럼을 이용할 것인가 → 식당 이름, 주문 수량, 주문 금액, 
  3. 어떤 조건을 지정해야 하는가 → X
  4. 어떤 함수 (수식) 을 이용해야 하는가 → 합계 구하는 기능, 갯수 수하는 기능
  1. 어떤 테이블에서 데이터를 뽑을 것인가 → from food_orders
  2. 어떤 컬럼을 이용할 것인가 → restaurant_name, price
  3. 어떤 조건을 지정해야 하는가 → X
  4. 어떤 함수 (수식) 을 이용해야 하는가 → sum(quantity), sum(price), case when, group by

select

        restaurant_name,

        CASE

                when a.total_quantity <=5 then 0.1

                when a.total_quantity >15 and a.total_price >=300000 then 0.005

                else 0.01

        END as vct

from

(

select

        restaurant_name,

        sum(quantity) as total_quantity,

        sum(price) as total_price

from sparta.food_orders

group by restaurant_name

) a

 

해설)

  1. 어떤 테이블에서 데이터를 뽑을 것인가 → 주문 테이블
  2. 어떤 컬럼을 이용할 것인가 → 음식점 이름, 주문 수량, 주문 금액
  3. 어떤 조건을 지정해야 하는가 → X
  4. 어떤 함수 (수식) 을 이용해야 하는가 → 합계를 구하는 기능, 조건문
  1. 어떤 테이블에서 데이터를 뽑을 것인가 → from food_orders
  2. 어떤 컬럼을 이용할 것인가 → restaurant_name, quantity, price
  3. 어떤 조건을 지정해야 하는가 → X
  4. 어떤 함수 (수식) 을 이용해야 하는가 → sum(quantity), sum(price), case when

select

        restaurant_name,

        case

              when sum_of_quantity<=5 then 0.1

              when sum_of_quantity>15 and sum_of_price>=300000 then 0.005

              else 0.01

        end ratio_of_add

from

(

select

        restaurant_name,

        sum(quantity) sum_of_quantity,

        sum(price) sum_of_price

from food_orders

group by 1

) a

 

=> 드디어 정답  ♪(´▽`)

 

필요한 데이터가 서로 다른 테이블에 있을때 조회하기 (JOIN)

- JOIN이 필요한 경우

● 주문 가격은 주문테이블에 있지만, 어떤 수단으로 결제를 했는지는 결제테이블에 존재할 때.

● 주문을 한 사람을 확인하려면, 주문 테이블과 고객 테이블에서 각각 정보를 가져와서 엑셀에서 합쳐줘야 할때.

● 주문 건별 수수료를 계산하려면 수수료율이 필요한데, 결제 테이블에 있어서 어떻게 연산할 수 있을지 모를 때.

- JOIN의 기본 원리와 종류

● 기본적으로 엑셀의 Vlookup 과 유사

● LEFT JOIN : 공통 컬럼 (키값) 을 기준으로, 하나의 테이블에 값이 없더라도 모두 조회되는 경우

● INNER JOIN : 공통 컬럼 (키값) 을 기준으로, 두 테이블 모두에 있는 값만 조회하는 경우

- JOIN의 기본 구조

-- LEFT JOIN
select 조회 할 컬럼
from 테이블1 a left join 테이블2 b on a.공통컬럼명=b.공통컬럼명
-- INNER JOIN
select 조회 할 컬럼
from 테이블1 a inner join 테이블2 b on a.공통컬럼명=b.공통컬럼명

**공통컬럼은 묶어주기 위한 '공통 값' 이기 때문에 두 테이블의 컬럼명은 달라도 괜찮다. ON 뒤에 공통컬럼끼리 묶어주면 된다.

 

# 실습 1

한국 음식의 주문별 결제 수단과 수수료율을 조회하기

(조회 컬럼 : 주문 번호, 식당 이름, 주문 가격, 결제 수단, 수수료율)

*결제 정보가 없는 경우도 포함하여 조회

 

답)

  1. 어떤 테이블에서 데이터를 뽑을 것인가 → 주문 테이블, 계산 테이블
  2. 어떤 컬럼을 이용할 것인가 → 주문 번호, 식당 이름, 주문 가격, 결제 수단, 수수료율
  3. 어떤 조건을 지정해야 하는가 → X
  4. 어떤 함수 (수식) 을 이용해야 하는가 → X
  1. 어떤 테이블에서 데이터를 뽑을 것인가 → from food_orders, from payments
  2. 어떤 컬럼을 이용할 것인가 → customer_id, restaurant_name, price, pay_type, vat
  3. 어떤 조건을 지정해야 하는가 → X
  4. 어떤 함수 (수식) 을 이용해야 하는가 → X 

select

        a.customer_id,

        a.restaurant_name,

        a.price,

        p.pay_type,

        p.vat

from sparta.food_orders a inner join sparta.payments p on a.order_id=p.order_id

 

해설)

  1. 어떤 테이블에서 데이터를 뽑을 것인가 → 주문 테이블
  2. 어떤 컬럼을 이용할 것인가 → 주문 번호, 식당 이름, 주문 가격, 결제 수단, 수수료율, 음식 타입
  3. 어떤 조건을 지정해야 하는가 → 한국 음식
  4. 어떤 함수 (수식) 을 이용해야 하는가 → 두 테이블의 결합
  1. 어떤 테이블에서 데이터를 뽑을 것인가 → from food_orders, payments
  2. 어떤 컬럼을 이용할 것인가 → order_id, restaurant_name, price, pay_type, vat
  3. 어떤 조건을 지정해야 하는가 → where cuisine_type=’Korean’
  4. 어떤 함수 (수식) 을 이용해야 하는가 → left join payments (on order_id)

select

        a.order_id,

        a.restaurant_name,

        a.price,

        b.pay_type,

        b.vat

from food_orders a left join payments b on a.order_id=b.order_id

where cuisine_type='Korean'

 

=> 문제의 제일 첫 문구인 '한국 음식의' 를 의식하지 못했다. WHERE문을 이용해 음식 타입을 한국으로만 조건을 걸어줘야한다. 또한 주문된 정보는 모두 조회하기 위해 주문 정보가 있다면 결제 정보 등 다른 정보가 없더라도 결과문에 출력하기 위해 INNER JOIN이 아닌 LEFT JOIN을 사용해야 한다.

 

# 실습 2

고객의 주문 식당 조회하기

(조회 컬럼 : 고객 이름, 연령, 성별, 주문 식당)

*고객명으로 정렬, 중복 없도록 조회

 

답)

SELECT

            c.customer_id,

            c.age,

            c.gender,

            f.restaurant_name

FROM sparta.food_orders f left join sparta.customers c on f.customer_id=c.customer_id

group by c.customer_id

order by c.customer_id

 

해설)

  1. 어떤 테이블에서 데이터를 뽑을 것인가 → 고객테이블, 주문 테이블
  2. 어떤 컬럼을 이용할 것인가 → 고객 이름, 연령, 성별, 주문 식당
  3. 어떤 조건을 지정해야 하는가 → X
  4. 어떤 함수 (수식) 을 이용해야 하는가 → 두 테이블의 결합, 정렬, 중복 제거
  1. 어떤 테이블에서 데이터를 뽑을 것인가 → from customers, food_orders
  2. 어떤 컬럼을 이용할 것인가 → name, age, gender, restaurant_name
  3. 어떤 조건을 지정해야 하는가 → X
  4. 어떤 함수 (수식) 을 이용해야 하는가 → left join orders (on customer_id), order by , distinct

select

        distinct c.name,

        c.age,

        c.gender,

        f.restaurant_name

from food_orders f left join customers c on f.customer_id=c.customer_id

order by c.name

 

=> 고객명은 'customer_id' 컬럼이 아닌 'name' 컬럼이다. 컬럼 선정부터 문제가 발생한 것이다. 문제의 맨 마지막 줄을 보면 '고객명으로 정렬, 중복 없도록 조회'를 통해 조건을 알 수 있다. 먼저 '고객명으로 정렬' 은 ORDER BY문을 통해 'name' 컬럼으로 정렬한다. 또, '중복 없도록 조회' 는 SELECT문에서 DISTINCT를 활용해 중복을 제거해줘야 한다.

 

# 실습 3

주문 가격과 수수료율을 곱하여 주문별 수수료 구하기

(조회 컬럼 : 주문 번호, 식당 이름, 주문 가격, 수수료율, 수수료)

*수수료율이 있는 경우만 조회

 

답)

select

        fo.customer_id,

        fo.restaurant_name,

        fo.price,

        p.vat,

        (fo.price*p.vat) as money_vat

from sparta.food_orders fo inner join sparta.payments p on fo.order_id=p.order_id

 

해설)

  1. 어떤 테이블에서 데이터를 뽑을 것인가 → 주문 테이블, 결제 테이블
  2. 어떤 컬럼을 이용할 것인가 → 주문 번호, 식당 이름, 주문 가격, 수수료율
  3. 어떤 조건을 지정해야 하는가 → X
  4. 어떤 함수 (수식) 을 이용해야 하는가 → 두 테이블의 결합, 곱하기
  1. 어떤 테이블에서 데이터를 뽑을 것인가 → from food_orders, payments
  2. 어떤 컬럼을 이용할 것인가 → order_id, restaurant_name, price, vat
  3. 어떤 조건을 지정해야 하는가 → X
  4. 어떤 함수 (수식) 을 이용해야 하는가 → inner join, price*vat

select

        f.order_id,

        f.restaurant_name,

        f.price,

        p.vat,

        f.price*p.vat "수수료율"

from food_orders f inner join payments p on f.order_id=p.order_id

 

=> 컬럼 선택에서 오류가 지속적으로 발생하고 있다. 컬럼명을 조금 더 숙지할 필요성을 느낀다. 주문 번호는 'order_id' 컬럼이다. 'customer_id' 컬럼은 아마 고객 번호인 것 같다. '수수료율이 있는 경우만 조회' 라는 문구를 통해 INNER JOIN 문을 써야한다는 것을 알 수 있다.

 

# 실습 4

50세 이상 고객의 연령에 따라 경로 할인율을 적용하고, 음식 타입별로 원래 가격과 할인 적용 가격 합을 구하기

(조회 컬럼 : 음식 타입, 원래 가격, 할인 적용 가격)

*할인 : (나이-50)*0.005

* 고객 정보가 없는 경우도 포함하여 조회, 할인 금액이 큰 순서대로 정렬

 

답)

select

        fo.cuisine_type,

        fo.price,

        fo.price-((c.age-50)*0.005) as discount_price

from sparta.food_orders fo left join sparta.customers c on fo.customer_id=c.customer_id

order by discount_price desc

 

해설)

  1. 어떤 테이블에서 데이터를 뽑을 것인가 → 주문 테이블, 고객 테이블
  2. 어떤 컬럼을 이용할 것인가 → 음식 타입, 주문 금액, 연령
  3. 어떤 조건을 지정해야 하는가 → 50세 이상
  4. 어떤 함수 (수식) 을 이용해야 하는가 → 두 테이블의 결합, 곱하기, 합계
  1. 어떤 테이블에서 데이터를 뽑을 것인가 → from food_orders, customers
  2. 어떤 컬럼을 이용할 것인가 → cuisine_type, price, age
  3. 어떤 조건을 지정해야 하는가 → where age>=50
  4. 어떤 함수 (수식) 을 이용해야 하는가 → avg(price/quantity), case when, group by

select

        cuisine_type,

        sum(price) price,

        sum(price*discount_rate) discounted_price

from

(

select

        f.cuisine_type,

        f.price,

        c.age,

       (c.age-50)*0.005 discount_rate

from food_orders f left join customers c on f.customer_id=c.customer_id

where c.age>=50

) a

group by 1

order by SUM(price - (price * discount_rate)) desc

 

=> Subquery문을 사용해야하는 문제였다. 우선 Subquery에서 '50세 이상 고객의 연령에 따라 경로 할인율을 적용하고' 를 담아야한다. '50세 이상의 고객의 연령에 따라'를 만족하기 위해 WHERE 문을 통해 age>=50 의 조건을 걸어줘야 한다. 할인율을 계산한 후 본 Query문을 작성해야 한다. '음식 타입별로 원래 가격과 할인 적용 가격 합을 구하기' 에 나와 있듯이 SELECT 문에서 '음식타입', '원래 가격 합', '할인 적용 가격 합' 컬럼을 불러와야 한다. '할인 적용 가격' 컬럼은 '원래 가격' 컬럼에 Subquery문에서 구한 '할인율' 컬럼을 곱해줘서 구해야 한다. 그리고 맨 마지막 줄의 '할인 금액이 큰 순서대로 정렬'을 하기 위해서는 '원래 가격' 컬럼에서 '할인 적용 가격' 컬럼을 뺀 총합을 DESC를 사용해 내림차순으로 정렬해주면 마무리 된다.

 

HW. 4주차 숙제

식당별 평균 음식 주문 금액과 주문자의 평균 연령을 기반으로 Segmentation 하기

- 평균 음식 주문 금액 기준 : 5,000 이하 / ~10,000 / ~30,000 / 30,000 초과

- 평균 연령 : ~ 20대 / 30대 / 40대 / 50대 이상

 

답)

select

        a.restaurant_name,

        case 

              when a.avg_price <=5000 and age<=29 then

              when a.avg_price <10000 and age<=39 then

              when a.avg_price <30000 and age<=49 then

              else

        end

from

(

select

        fo.restaurant_name,

        avg(fo.price) as avg_price,

        avg(c.age) as avg_age

from sparta.food_orders fo left join sparta.customers c on fo.customer_id=c.customer_id

group by fo.restaurant_name

) a

 

해설)

select

        restaurant_name,

        case

              when price <=5000 then 'price_group1'

              when price >5000 and price <=10000 then 'price_group2'

              when price >10000 and price <=30000 then 'price_group3'

              when price >30000 then 'price_group4'

        end price_group,

        case

              when age <30 then 'age_group1'

              when age between 30 and 39 then 'age_group2'

              when age between 40 and 49 then 'age_group3'

              else 'age_group4'

        end age_group

from

(

select

        a.restaurant_name,

        avg(price) price,

        avg(age) age

from food_orders a inner join customers b on a.customer_id=b.customer_id

group by 1

) t

order by 1

 

=> 문제의 '기반으로 Segmentation 하기' 부분이 우선 어떤 것을 의도하는지 이해할 필요가 있다. 저 말은 무슨 말일까.. 아마 '특정 컬럼의 값을 조건식(CASE WHEN)으로 분류해서 새로운 그룹 이름을 만들어라' 가 문제의 의도였던 것 같다. 또한 평균 음식 주문 금액과 주문자의 평균 연령을 따로 따로 Segmentaion 했어야 했다. 본인은 두 개의 조건을 하나의 조건으로 해석해 풀어 문제의 결과값에 도달할 수 없었다. 본 Query문은 조건별로 CASE WHEN 문을 활용해 Segmentation을 하고 ORDER BY 문을 통해 식당 이름으로 정렬하면 마무리된다.

과제인 만큼 문제만 보고 다시 풀어보는 시간을 가진 후 제출을 하고자 한다.

 

2차 답안)

select

        a.restaurant_name,

        CASE

                when a.avg_price <=5000 then 'price_seg1'

                when a.avg_price <10000 then 'price_seg2'

                when a.avg_price <30000 then 'price_seg3'

                else 'price_seg4'

        END as price_seg,

        case

              when a.avg_age <=29 then 'age_seg1'

              when a.avg_age between 30 and 39 then 'age_seg2'

              when a.avg_age between 40 and 49 then 'age_seg3'

              else 'age_seg4'

        end as age_seg

from

(

select

        fo.restaurant_name,

        avg(fo.price) as avg_price,

        avg(c.age) as avg_age

from sparta.food_orders fo left join sparta.customers c on fo.customer_id=c.customer_id

group by fo.restaurant_name

) as a

order by a.restaurant_name

 

=> 여전히 오류가 존재하지만 장족의 발전이다. 우선 CASE WHEN문을 이용할 때 문자로 명을 칭할때는 ' ' 을 써줘야 한다. 조건은 조금 더 정확히 이해할 필요가 있다. 몇번째냐; 조건을 조금 더 세분화 해서 지정하지 않으면 결과값이 달라진다. 주의가 필요하다.

 

주말의 회고

시작은 잠이 안와 심심한데 개념이나 정리해볼까였다. 결국 강의를 5주차까지 마무리하진 못했다. 하지만 실습문제를 고민해보는 시간을 다시 가지며 문제를 읽어내는데 점점 눈이 뜨는 것 같다. 조금 더 시간을 할애하면 분명 늘지 않을까? 토요일 밤, 일요일 낮에 가져보는 시간은 분명 도움이 되었다. 평일에는 개인 시간을 전혀 가질 수 없기에 이젠 개인 정비 시간을 가져볼까 한다. 주말 마무리 잘하고 평일에 흐름을 그대로 탈 것이다.