ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 7월 17일 월요일 TIL 회고록
    카테고리 없음 2023. 7. 18. 01:10

    프로그래머스 SQL 문제


    서울에 위치한 식당 목록 출력하기

    문제 설명 및 문제, 예시

    -- 코드를 입력하세요
    SELECT ri.rest_id, ri.rest_name, ri.food_type, ri.favorites, ri.address,round(avg(review_score), 2) as score
    from rest_info ri
    left join rest_review on ri.rest_id = rest_review.rest_id
    where ri.address like '서울%'
    group by ri.rest_id
    order by score desc, ri.favorites desc

    SELECT 문에는 예시 맨 밑에 있는 결과처럼 출력되어야 하므로 똑같이 작성했다. 

    리뷰의 평균 점수와 평균 점수를 소수점 세번째 자리에서 반올림 해야하므로 평균 점수를 구할 수 있는 avg와 소수점을 반올림 할 수 있는 round("값","자리수)를 사용했다.

    left join을 사용해 rest_info 테이블의 모든 레코드와 두 테이블에서 rest_id값이 일치하는 레코드를 검색한다.

    where문에서는 like를 사용해 주소가 '서울'로 시작하는 레코드를 검색한다.

    group by문을 사용해 rest_id가 같은 데이터를 그룹으로 묶는다.

    order by문을 사용해 score를 내림차순으로 정렬하고, score가 같으면 favorites 수를 기준으로 내림차순으로 정렬시켰다.


    오프라인/온라인 판매 데이터 통합하기

    문제 설명 및 문제, 예시

    -- 코드를 입력하세요
    SELECT date_format(SALES_DATE,"%Y-%m-%d"), product_id, user_id, sales_amount
    from online_sale
    where sales_date Like '2022-03%'
    
    Union All
    
    SELECT date_format(SALES_DATE,"%Y-%m-%d"), product_id, null as user_id, sales_amount
    from offline_sale
    where sales_date Like '2022-03%'
    order by 1,2,3

    SELECT문 한개로는 문제를 풀 수 없을 것 같아 UNION ALL을 사용했다.

    UNION : 각 쿼리의 결과 합을 반환하는 합집합 (중복을 제거해준다.)
    UNION ALL : 각 쿼리의 모든 결과를 포함한 합집합 (중복을 제거하지 않는다.)

    날짜 형식을 DATE_FORMAT()을 사용해서 형식을 바꿔주었다. 바꿔주지 않으면 2023-07-17:00:00 이런식으로 출력되므로 바꿔주었다.

    DATE_FORMAT(날짜, 형식) :  날짜를 지정한 형식으로 출력해준다.

    구분 기호
    구분 기호 역할 구분 기호  역할
    %Y 4자리 년도 %m 숫자 월 (두자리)
    %y 2자리 년도 %c 숫자 월 (한자리는 한자리)
    %M 긴 월(영문) %d 일자 (두자리)
    %b 짧은 월(영문) %e 일자 (한자리는 한자리)
    %W 긴 요일 이름(영문) %I 시간 (12시간)
    %a 짧은 요일 이름(영문) %h 시간 (24시간)
    %i %r hh:mm:ss AM,PM
    %T hh:mm:SS %s

    from문은 online_sale 테이블에서 조회할 것이고

    where문에서는 like를 사용해 판매일이 2022년 3월인 데이터만 검색하도록 작성했다.

     그 후 UNION ALL 을 사용해 SELECT 문을 하나 더 작성했다.

     

    SELECT는 위에 SELECT 문과 같으나 user_id 컬럼이 없으므로 null로 만들었다.

    from은 이번에는 offline_sale 테이블에서 조회할 것이고

    where문에서는 위에 SELECT 문과 같이 판매일이 2022년 3월인 데이터만 검색하도록 작성했다.

    ORDER BY 문을 사용해 판매일을 기준으로 오름차순으로 정렬하고, 판매일이 같으면 상품 ID를 기준으로 오름차순으로 정렬하고, 상품 ID까지 같다면 유저 ID를 기준으로 오름차순으로 정렬될 수 있게 만들었다.

     

    실행 결과


    입양 시각 구하기 (1)

    문제 설명 및 예시

    -- 코드를 입력하세요
    SELECT hour(datetime), count(animal_id)
    from animal_outs
    where hour(datetime) between 09 and 20
    group by hour(datetime)
    order by hour(datetime) asc

    예시를 보면 시간이 YY-mm-dd로 되어있지 않고 9 ,10 , 11 ... 이런식으로 시간단위로 나와있다 (YY-mm-dd:hh:mm:ss 부분에서 hh)

    그래서 예시와 같이 형식을 바꿔줘야 하는데, 나는 hour(날짜)를 사용해서 추출했다. count도 예시와 같이 입양이 몇건 발생했는지 조회해야하는데, 나는 animal_id로 조회하게 만들었다. count()를 사용해서 조회하게 만들었다.

    where 문에서 between을 사용해 hour(datetime)이 09시부터 19시까지만 검색하게 만들었다.

    group by문을 사용해 hout(datetime)가 같은 데이터를 그룹으로 묶고

    order by문을 사용해 시간대 순으로 정렬시켰다.

     

    실행 결과


    봐두면 좋을 것 같은 블로그

    SQL 기본 문법 정리

     

    [MySQL] - SQL 기본 문법 정리 - (SELECT, WHERE, ORDER BY ..)

    - SELECT 문의 기본 형식은 다음과 같다. SELECT 열_이름 FROM 테이블_이름 WHERE 조건식 GROUP BY 열_이름 HAVING 조건식 ORDER BY 열_이름 LIMIT 숫자 📌 USE - 스키마 (데이터베이스) 선택 -- USE '스키마명' USE mark

    rachel0115.tistory.com

     

Designed by Tistory.