민듀키티

프로그래머스 SQL 코딩테스트 (LEVEL 3 - 2) 본문

Coding Test/SQL

프로그래머스 SQL 코딩테스트 (LEVEL 3 - 2)

민듀키티 2023. 4. 13. 20:36

🔴 문제 1 : 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/151139

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

- 주의해야 할 것 :  나 자꾸 서브쿼리 안써서 해결할려고 함,,, 왜냐 칼럼 정의가 복잡해지거든 ,, 

 

이거 안 풀려 ㅠㅠㅠ

내일 풀어야지

 

 


🔴 문제 2 : 카테고리 별 도서 판매량 집계하기

https://school.programmers.co.kr/learn/courses/30/lessons/144855

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

정답 )

SELECT CATEGORY, sum(b.SALES) as TOTAL_SALES
FROM BOOK as a, BOOK_SALES as b
WHERE a.BOOK_ID = b.BOOK_ID
and DATE_FORMAT(b.SALES_DATE,'%Y%m') = 202201
GROUP BY a.CATEGORY
ORDER BY a.CATEGORY

 


🔴 문제 3 : 즐겨찾기가 가장 많은 식당 정보 출력하기

https://school.programmers.co.kr/learn/courses/30/lessons/131123

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

정답 )

SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM (SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES,
      RANK() over (partition by FOOD_TYPE order by FAVORITES desc) as rn
      FROM REST_INFO ) as a
where a.rn = 1
order by FOOD_TYPE desc
  • RNAK OVER 은 WHERE 절과 HAVING 절에 사용할 수 없음. 따라서 서브쿼리를 만들어서 진행
  • mysql은 서브쿼리에 Alias을 주지 않으면 오류 발생 -> 그러나 오라클은 괜찮음

 

주요 함수 정리) 그룹별로 최댓값 혹은 최솟값 뽑기

  • RANK() OVER (PARTITION BY 0000 ORDER BY 0000)  : 1등이 2명이면 다음 순위는 3등
  • DENSE_RANK() OVER (PARTITION BY 0000 ORDER BY 0000) : 각각의 행에 대한 일련의 번호
  • ROW_NUMBER() OVER (PARTITION BY 0000 ORDER BY 0000) : 1등이 2명이어도 1등, 2등 매김

PARTITION BY는 필수가 아니지만, ORDER BY는 필수임

 


🔴 문제 4 : 조건별로 분류하여 주문상태 출력하기

https://school.programmers.co.kr/learn/courses/30/lessons/131113

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

- 주의해야 할 것 : OUT_DATE와 PRODUCT_DATE 칼럼 헷갈리지 않기

 

정답 )

SELECT ORDER_ID,PRODUCT_ID,DATE_FORMAT(OUT_DATE, "%Y-%m-%d") as OUT_DATE,
(CASE WHEN DATE_FORMAT(OUT_DATE, "%Y%m%d") <= 20220501 then "출고완료"
    when DATE_FORMAT(OUT_DATE, "%Y%m%d") > 20220501 then "출고대기"
    else "출고미정" end) as 출고여부
FROM FOOD_ORDER
ORDER BY ORDER_ID

 


🔴 문제 5 : 헤비 유저가 소유한 장소

https://school.programmers.co.kr/learn/courses/30/lessons/77487

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

- 주의해야 할 것 : GROUP BY를 사용하면 GROUP으로 묶어져서 칼럼이 한 개 밖에 안나와 ,,, 그래서 WHERE절에 IN 조건을 사용한다 !

 

 

정답 )

SELECT *
FROM PLACES
WHERE HOST_ID IN (SELECT HOST_ID
               FROM PLACES
               GROUP BY HOST_ID
               HAVING COUNT(*) >= 2)
ORDER BY ID;