11.19(화) 사전캠프 5일째 기록

Laña·2024년 11월 19일
0
post-thumbnail

<아티클 스터디>

  • 데이터를 분석하여 문제를 해결하는 것도 좋지만 그 결과가 잘못되진 않았는지에 대해 다시 생각해볼 필요가 있다. 누구나 어떤 문제를 직면할때, 최대한 빠르게 해결하고 싶을 것 같다. 이러한 생각과 연관짓는 것을 잘하는 사람의 강점을 합쳤을 때, 성급한 일반화의 오류가 발생한다고 생각한다.
    그러니 현재 하고 있는 데이터 분석 과정을 객관적으로 잘 파악하며 다양한 오류들을 범하고 있는것은 아닌지 왜 그런 결과가 나온것인지 더블체크를 할 필요가 있다.
    +그 데이터는 잘못 해석되었습니다.

<오늘 배운 것 요약>

  • SQL 4주차
    여러 번의 연산을 한 번의 SQL문으로 수행 (Subquery)
    1. Subquery가 필요한 경우
    - 여러번의 연산을 수행해야 할 때
    - 조건문에 연산 결과를 사용해야 할 때
    - 조건에 Query 결과를 사용하고 싶을 때
    2. 기본 구조 query1 ( query2 )
    select column1, "컬럼2"
    from
    (
    select column1, column2 "컬럼2"
    from table1

    ) a
    3. 예시
    예) 주문 테이블에서 음식점명, 가격, 주소 가져오기
    select restaurant_name,
    price,
    addr
    from
    (
    select restaurant_name,
    price,
    addr
    from food_orders

    ) a 필요한 데이터가 서로 다른 테이블에 있을때 (JOIN)
    1. Join 이 필요한 경우
    - 주문 가격 (주문테이블)/ 결제 수단(결제테이블)
    - 주문한 사람(주문 + 고객 테이블)
    2. 기본 원리, 종류
    원리: 엑셀의 VLOOKUP과 유사
    JOIN의 종류

    1. ~1 1 LEFT JOIN ~2 2 on 1.same_column=2.same_column
    ; 둘 중 하나만 있어도 모두 조회
    기본 구조
    select 조회 할 컬럼
    from 테이블1 1 left join 테이블2 2 on 1.공통컬럼명=2.공통컬럼명
    2. ~1 1 INNER JOIN ~2 2 on 1.same_column=2.same_column
    ; 둘 다 있어야 조회 = 둘 중 하나만 있는건 조회 안됨
    기본 구조
    select 조회 할 컬럼
    from 테이블1 1 inner join 테이블2 2 on 1.공통컬럼명=2.공통컬럼명

    이때 '공통 값'을 묶는 것이기에 컬럼명은 달라도 괜찮음!

  1. 예시
    주문 테이블과 결제 테이블을 order_id를 기준으로 inner_join으로 묶어보기
    (조회 컬럼: order_id, restaurant_name, price, pay_type, vat)
    select f.order_id,
    f.restaurant_name,
    f.price,
    p.pay_type
    p.vat
    from food_orders f inner join payments p on f.order_id=p.order_id
  • 4주차 숙제
    문제: 식당별 평균 음식 주문 금액과 주문자의 평균 연령을 기반으로 Segmentation 하기

<지시사항>
1. 평균 음식 주문 금액 기준 : 5,000 / 10,000 / 20,000 / 30,000 초과
2. 평균 연령 : ~ 20대 / 30대 / 40대 / 50대 이상
3. 두 테이블 모두에 데이터가 있는 경우만 조회, 식당 이름 순으로 오름차순 정렬

select a.restaurant_name,
		case when avg_price>=30000 then '3만원 초과'
        	 when avg_price>=20000 then '2만원'
             when avg_price>=10000 then '1만원'
             when avg_price<=5000 then '5천원' end 금액대,
        case when avg_age>=50 then '50대 이상'
        	 when avg_age>=40 then '40대'
             when avg_age>=30 then '30대'
             else '~20대' end 나이대
from 
(
select	f.restaurant_name,
		avg(price) avg_price,
		avg(age) avg_age
from food_orders f inner join customers c on f.customer_id=c.customer_id
group by 1
) a
order by 1
profile
SQL, Python, Code Kata

0개의 댓글