민듀키티

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

Coding Test/SQL

프로그래머스 SQL 코딩테스트 (LEVEL 4 - 1)

민듀키티 2023. 4. 19. 15:49

🔴 문제 1 : 5월 식품들의 총매출 조회하기

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

 

프로그래머스

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

programmers.co.kr

 

정답 )

SELECT a.PRODUCT_ID, a.PRODUCT_NAME, a.PRICE * sum(b.AMOUNT) as TOTAL_SALES
FROM FOOD_PRODUCT as a, FOOD_ORDER as b
WHERE a.PRODUCT_ID = b.PRODUCT_ID
and DATE_FORMAT(b.PRODUCE_DATE, "%Y%m" ) = 202205
GROUP BY b.PRODUCT_ID
ORDER BY TOTAL_SALES desc, a.PRODUCT_ID

- FOOD_PRODUCT 테이블과 FOOD_ORDER 테이블을 RPODUCT_ID 칼럼을 기준으로 JOIN 해줍니다. (left join 사용도 가능)

- 생산일이 2022년 5월인 상품을 출력해야하기 때문에 DATE_FORMAT 함수 사용

- PRODUCT_ID 별로 출력하기 때문에 GROUP_BY 함수를 사용하여 GROUP BY b.PRODUCT_ID 사용 ( SELECT 절에서 AMOUNT에 SUM 함수 사용하기)


 

🔴 문제 2 :  서울에 위치한 식당 목록 출력하기

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

 

프로그래머스

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

programmers.co.kr

- 주의해야 할 것 : 서울에 위치한 식당 출력하기 "%서울%" 가 아닌 "서울%" 로 출력해야 함

 

정답 )

SELECT a.REST_ID, a.REST_NAME, a.FOOD_TYPE, a.FAVORITES, a.ADDRESS,
ROUND(AVG(REVIEW_SCORE),2) as SCORE
FROM REST_INFO as a join REST_REVIEW as b
on a.REST_ID = b.REST_ID	
and a.ADDRESS like "서울%"
group by a.REST_ID
order by SCORE desc, FAVORITES desc

 

 

주요 함수 정리) 반올림 함수

  • 반올림함수 : ROUND(값), 소수점 자릿수)
  • 올림함수 : CEILING(값) -> 무조건 정수로 출력됨
  • 내림함수 :  FLOOR(값) -> 무조건 정수로 출력됨

 


🔴 문제 3 : 년, 월, 성별 별 상품 구매 회원 수 구하기

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

 

프로그래머스

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

programmers.co.kr

- 주의해야할것 : 상품을 구매한 회원수를 집계하는 것이기 때문에 count(distinct b.USER_ID ) 을 사용해야 함

 

 

정답 )

SELECT YEAR(SALES_DATE) as YEAR, MONTH(SALES_DATE) as MONTH,
a.GENDER, count(distinct b.USER_ID ) as USERS
FROM USER_INFO as a, ONLINE_SALE as b
WHERE a.USER_ID = b.USER_ID
and a.GENDER is not null
GROUP BY YEAR(SALES_DATE),MONTH(SALES_DATE),GENDER
ORDER BY YEAR(SALES_DATE),MONTH(SALES_DATE),GENDER

 

 


🔴 문제 4 : 식품분류별 가장 비싼 식품의 정보 조회하기

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

 

프로그래머스

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

programmers.co.kr

 

정답 ) 

SELECT CATEGORY, PRICE as MAX_PRICE, PRODUCT_NAME
FROM (SELECT CATEGORY, PRICE, PRODUCT_NAME,
      RANK() OVER (PARTITION BY CATEGORY ORDER BY PRICE desc) as rn
      FROM FOOD_PRODUCT ) as a
WHERE a.rn = 1 and CATEGORY in ('과자', '국', '김치', '식용유')
ORDER BY MAX_PRICE desc

- 저는 서브쿼리를 활용했습니다. 

 

주요함수정리)

그룹내에서 상위값 n개 구하기 문제가 나올 경우 PARTITION BY 사용

  • 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등 매김

여러 검색어를 하나의 컬럼에서 일치하는 값들을 조회할 때는 WHERE ~  IN 사용

 


🔴 문제 5 : 우유와 요거트가 담긴 장바구니

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

 

프로그래머스

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

programmers.co.kr

 

 

정답 ) 

SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME in ("Milk","Yogurt")
GROUP BY CART_ID
HAVING count(distinct NAME) >= 2
ORDER BY CART_ID

- 우유와 요거트를 동시에 구입한 유저를 알아야하기 때문에, NAME이 우유와 요거트인 칼럼만 추출함

- 카트 아이디를 기준으로 그룹화하여, HAVING 절 사용

- NAME이 우유와 요거트인 칼럼만 추출하였기 때문에, 동시에 산 사람들의 count(distinct NAME) 값은 2일 것임

 

 

 

 

 

점점 느는 것 같아서 기분이 좋아요 !!