MySQL_프로그래머스-5

soyeong·2022년 10월 21일
0

프로그래머스 SQL

목록 보기
5/6
post-thumbnail

🚩 프로그래머스(programmers)에서 제공하는 SQL 문제풀기
🚩 JOIN

📌 Level 2

🟩 상품 별 오프라인 매출 구하기

1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/131533
2. 코드

SELECT PRODUCT_CODE, SUM(PRICE*SALES_AMOUNT) AS SALES
  FROM PRODUCT A
  JOIN OFFLINE_SALE B
  ON A.PRODUCT_ID=B.PRODUCT_ID
  GROUP BY PRODUCT_CODE
  ORDER BY SALES DESC, PRODUCT_CODE ASC;

3. 코드 해석
해당 문제는 PRODUCT 테이블과 OFFLINE_SALE 테이블에서 상품코드(PRODUCT_CODE) 별 매출액(판매가PRICE * 판매량SALES_AMOUNT) 합계(SALES)를 출력하기 위해 SELECT~FROM문을 사용한다. 상품코드(PRODUCT_ID)로 내부 조인(INNER JOIN)하고, 상품코드별 매출액의 합계를 구하기 위해 GROUP BY절을 사용한다. 또한 ORDER BY절을 사용하여 매출액(SALES)을 기준으로 내림차순(DESC) 정렬하고, 매출액이 같다면 상품코드(PRODUCT_CODE)를 기준으로 오름차순(ASC) 정렬한다.


📌 Level 3

🟩 오랜 기간 보호한 동물(1)

1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59044
2. 코드

SELECT I.NAME, I.DATETIME
  FROM ANIMAL_INS I
  LEFT OUTER JOIN ANIMAL_OUTS O
  ON I.ANIMAL_ID=O.ANIMAL_ID
  WHERE O.DATETIME IS NULL
  ORDER BY I.DATETIME ASC
  LIMIT 3;

3. 코드 해석
해당 문제는 ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블에서 동물 이름(NAME)과 보호 시작일(DATETIME)을 조회하기 위해 SELECT~FROM문을 사용한다. 동물의 아이디(ANIMAL_ID)로 외부 조인(OUTER JOIN)하고, 아직 입양을 못 간 동물(O.DATETIME IS NULL) 조건을 WHERE 조건절로 추가한다. 또한 가장 오래 보호소에 있었던 동물로 나열하기 위해 ORDER BY절을 사용하여 보호 시작일(I.DATETIME)로 오름차순(ASC) 정렬하고, LIMIT 숫자를 사용하여 동물 3마리만 조회한다.

🟩 있었는데요 없었습니다

1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59043
2. 코드

SELECT I.ANIMAL_ID, I.NAME
  FROM ANIMAL_INS I
  JOIN ANIMAL_OUTS O
  ON I.ANIMAL_ID=O.ANIMAL_ID
  WHERE I.DATETIME > O.DATETIME
  ORDER BY I.DATETIME ASC;

3. 코드 해석
해당 문제는 ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블에서 동물의 아이디(ANIMAL_ID)와 이름(NAME)을 조회하기 위해 SELECT~FROM문을 사용한다. 동물의 아이디(ANIMAL_ID)로 내부 조인(INNER JOIN)하고, 보호 시작일보다 입양일이 더 빠른 동물(I.DATETIME > O.DATETIME) 조건을 WHERE 조건절로 추가한다. 또한 ORDER BY절을 사용하여 보호 시작일(I.DATETIME)이 빠른 순로 조회하기 위해 오름차순(ASC) 정렬한다.

🟩 없어진 기록 찾기

1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59042
2. 코드

SELECT O.ANIMAL_ID, O.NAME
  FROM ANIMAL_INS I
  RIGHT OUTER JOIN ANIMAL_OUTS O
  ON I.ANIMAL_ID=O.ANIMAL_ID
  WHERE I.DATETIME IS NULL
  ORDER BY O.ANIMAL_ID ASC;

3. 코드 해석
해당 문제는 ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블에서 동물의 아이디(ANIMAL_ID)와 이름(NAME)을 조회하기 위해 SELECT~FROM문을 사용한다. 동물의 아이디(ANIMAL_ID)로 외부 조인(OUTER JOIN)하고, 동물 보호소에 들어온 기록이 없는 동물(I.DATETIME IS NULL) 조건을 WHERE 조건절로 추가한다. 또한 ORDER BY절을 사용하여 동물의 아이디(ANIMAL_ID)순으로 조회하기 위해 오름차순(ASC) 정렬한다.


📌 Level 4

🟩 보호소에서 중성화한 동물

1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59045
2. 코드

SELECT I.ANIMAL_ID, I.ANIMAL_TYPE, I.NAME
  FROM ANIMAL_INS I
  JOIN ANIMAL_OUTS O
  ON I.ANIMAL_ID=O.ANIMAL_ID
  WHERE (SEX_UPON_INTAKE LIKE 'Intact%') AND (SEX_UPON_OUTCOME LIKE 'Spayed%' OR SEX_UPON_OUTCOME LIKE 'Neutered%')
  ORDER BY ANIMAL_ID ASC;

3. 코드 해석
해당 문제는 ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블에서 동물의 아이디(ANIMAL_ID)와 생물 종(ANIMAL_TYPE), 이름(NAME)을 조회하기 위해 SELECT~FROM문을 사용한다. 동물의 아이디(ANIMAL_ID)로 내부 조인(INNER JOIN)하고, 보호소에 들어올 당시에는 중성화되지 않았지만(SEX_UPON_INTAKE LIKE 'Intact%'), 보호소를 나갈 당시에는 중성화된 동물(SEX_UPON_OUTCOME LIKE 'Spayed%' OR SEX_UPON_OUTCOME LIKE 'Neutered%') 조건을 WHERE 조건절로 추가한다. 또한 ORDER BY절을 사용하여 동물의 아이디(ANIMAL_ID)순으로 조회하기 위해 오름차순(ASC) 정렬한다.

🟩 5월 식품들의 총매출 조회하기

1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/131117
2. 코드

SELECT A.PRODUCT_ID, A.PRODUCT_NAME, SUM(A.PRICE*B.AMOUNT) AS TOTAL_SALES
  FROM FOOD_PRODUCT A
  JOIN FOOD_ORDER B
  ON A.PRODUCT_ID=B.PRODUCT_ID
  WHERE DATE_FORMAT(PRODUCE_DATE, '%Y-%m')='2022-05'
  GROUP BY A.PRODUCT_ID
  ORDER BY TOTAL_SALES DESC, PRODUCT_ID ASC;

3. 코드 해석
해당 문제는 FOOD_PRODUCT 테이블과 FOOD_ORDER 테이블에서 식품 ID(PRODUCT_ID), 식품 이름(PRODUCT_NAME), 총매출(TOTAL_SALES)을 조회하기 위해 SELECT~FROM문을 사용한다. 식품 ID(PRODUCT_ID)로 내부 조인(INNER JOIN)하고, 생산일자가 2022년 5월인 식품(DATE_FORMAT(PRODUCE_DATE, '%Y-%m')='2022-05') 조건을 WHERE 조건절로 추가한다. GROUP BY절로 식품 ID(PRODUCT_ID)로 묶어 총매출(SUM(A.PRICE*B.AMOUNT))을 계산한다. 또한 ORDER BY절을 사용하여 총매출(TOTAL_SALES)을 기준으로 내림차순(DESC) 정렬하고, 총매출이 같다면 식품 ID(PRODUCT_ID)를 기준으로 오름차순(ASC) 정렬한다.

🟩 그룹별 조건에 맞는 식당 목록 출력하기

1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/131124
2. 코드

SELECT A.MEMBER_NAME, B.REVIEW_TEXT, DATE_FORMAT(B.REVIEW_DATE, '%Y-%m-%d') AS REVIEW_DATE
  FROM MEMBER_PROFILE A
  JOIN REST_REVIEW B
  ON A.MEMBER_ID=B.MEMBER_ID
  WHERE B.MEMBER_ID IN (
  SELECT MEMBER_ID FROM REST_REVIEW GROUP BY MEMBER_ID HAVING COUNT(MEMBER_ID) = 
  (SELECT MAX(C.count) FROM (SELECT COUNT(MEMBER_ID) AS count FROM REST_REVIEW GROUP BY MEMBER_ID) C))
  ORDER BY REVIEW_DATE ASC, REVIEW_TEXT ASC;

3. 코드 해석


📌 Level 5

🟩 상품을 구매한 회원 비율 구하기

1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/131534
2. 코드

SELECT YEAR(A.SALES_DATE) AS YEAR, MONTH(A.SALES_DATE) AS MONTH, COUNT(DISTINCT(A.USER_ID)) AS PUCHASED_USERS, 
ROUND(COUNT(DISTINCT(A.USER_ID)) / (SELECT COUNT(*) FROM USER_INFO B WHERE YEAR(JOINED)=2021), 1) AS PUCHASED_RATIO
  FROM ONLINE_SALE A
  JOIN USER_INFO B
  ON A.USER_ID=B.USER_ID
  WHERE YEAR(B.JOINED)=2021
  GROUP BY YEAR, MONTH
  ORDER BY YEAR ASC, MONTH ASC;

3. 코드 해석


profile
The ultimate goal is to be a Data Scientist.

0개의 댓글