MySQL_프로그래머스-3

soyeong·2022년 10월 18일
0

프로그래머스 SQL

목록 보기
3/6
post-thumbnail

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

📌 Level 2

🟩 동명 동물 수 찾기

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

SELECT NAME, COUNT(*) AS COUNT
  FROM ANIMAL_INS
  GROUP BY NAME
  HAVING COUNT >= 2 AND NAME IS NOT NULL
  ORDER BY NAME ASC;

3. 코드 해석
해당 문제는 ANIMAL_INS 테이블에서 동물 이름 중 두 번 이상 쓰인 이름(NAME)과 해당 이름이 쓰인 횟수(COUNT)을 조회하기 위해 SELECT~FROM문을 사용한다. 이때 GROUP BY절을 활용하여 동물 이름(NAME)으로 그룹화하고, HAVING 조건절로 각 그룹에서 두 번 이상 쓰인 횟수(COUNT >= 2)이면서 이름이 없는 동물은 집계에서 제외(NAME IS NOT NULL)하는 조건을 추가한다. 또한 이름(NAME)순으로 나열해야 되므로 ORDER BY절과 오름차순 정렬인 ASC를 추가한다.

🟩 고양이와 개는 몇 마리 있을까

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

SELECT ANIMAL_TYPE, COUNT(*) AS count
  FROM ANIMAL_INS
  GROUP BY ANIMAL_TYPE
  ORDER BY ANIMAL_TYPE ASC;

3. 코드 해석
해당 문제는 ANIMAL_INS 테이블에서 동물 중 고양이와 개가 각각 몇 마리인지를 조회하기 위해 SELECT~FROM문을 사용한다. 고양이와 개는 생물 종(ANIMAL_TYPE)으로 파악이 가능하기 때문에 GROUP BY절을 활용하여 생물 종(ANIMAL_TYPE)으로 그룹화하고, 이때 각각 몇 마리인지는 COUNT(*)함수로 알 수 있다. 고양이를 개보다 먼저 조회하기 위해 생물 종(ANIMAL_TYPE)순으로 나열해야 되므로 ORDER BY절과 오름차순 정렬인 ASC를 추가한다.

🟩 입양 시각 구하기(1)

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

SELECT DATE_FORMAT(DATETIME, '%k') AS HOUR, COUNT(*) AS COUNT
  FROM ANIMAL_OUTS
  GROUP BY HOUR
  HAVING HOUR >= 9 AND HOUR <= 19
  ORDER BY HOUR*1 ASC;

3. 코드 해석
해당 문제는 ANIMAL_OUTS 테이블에서 몇 시에 입양이 가장 활발하게 일어났는지 조회하기 위해 SELECT~FROM문을 사용한다. 입양일(DATETIME)에서 입양 시간 중에 시간대(%k)만 추출하기 위해 DATE_FORMAT(날짜,형식)함수를 사용하고 별칭을 HOUR로 한다. GROUP BY절을 활용하여 시간대(HOUR)로 그룹화하고, HAVING 조건절로 09:00부터 19:59까지(HOUR >= 9 AND HOUR <= 19)의 조건을 추가한다. 따라서 각 시간대별로 입양이 몇 건이나 발생했는지는 COUNT(*)함수로 알 수 있다. 또한 시간대(HOUR)순으로 나열해야 되므로 ORDER BY절과 오름차순 정렬인 ASC를 추가한다.

🟩 가격대 별 상품 개수 구하기

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

SELECT TRUNCATE(PRICE, -4) AS PRICE_GROUP, COUNT(*) AS PRODUCTS
  FROM PRODUCT
  GROUP BY PRICE_GROUP
  ORDER BY PRICE_GROUP ASC;

3. 코드 해석
해당 문제는 PRODUCT 테이블에서 만원 단위의 가격대 별로 상품 개수를 출력하기 위해 SELECT~FROM문을 사용한다. 이때 판매가(PRICE)는 TRUNCATE(숫자, 버림할 자릿수)함수를 사용하여 0원 ~ 1만원 미만은 0, 1만원 이상 ~ 2만원 미만은 1, ..., 으로 가격대를 만들고 해당 별칭을 PRICE_GROUP으로 한다. GROUP BY절을 활용하여 가격대(PRICE_GROUP)로 그룹화하고, 이때 가격대 별 상품 개수가 몇 개인지는 COUNT(*)함수로 알 수 있다. 가격대(PRICE_GROUP)를 기준으로 나열해야 되므로 ORDER BY절과 오름차순 정렬인 ASC를 추가한다.

🟩 진료과별 총 예약 횟수 출력하기

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

SELECT MCDP_CD AS 진료과코드, COUNT(*) AS 5월예약건수
  FROM APPOINTMENT
  WHERE MONTH(APNT_YMD)=5
  GROUP BY 진료과코드
  ORDER BY 5월예약건수 ASC, 진료과코드 ASC;

3. 코드 해석
해당 문제는 APPOINMENT 테이블에서 2022년 5월에 예약한 환자 수를 진료과코드 별로 조회하기 위해 SELECT~FROM문을 사용한다. WHERE절에 2022년 5월 예약(MONTH(APNT_YMD)=5)의 조건을 추가한다. GROUP BY절을 활용하여 진료과코드(MCDP_CD)로 그룹화하한다. 따라서 각 진료과별 예약한 환자 수가 몇 명인지는 COUNT(*)함수로 알 수 있다. 또한 ORDER BY절을 사용하여 진료과별 예약한 환자 수(5월예약건수)기준으로 오름차순 정렬(ASC)하고, 예약한 환자 수가 같다면 진료과 코드(진료과코드)를 기준으로 오름차순 정렬(ASC)한다.


📌 Level 3

🟩 즐겨찾기가 가장 많은 식당 정보 출력하기

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

SELECT A.FOOD_TYPE, A.REST_ID, A.REST_NAME, A.FAVORITES
  FROM (SELECT FOOD_TYPE, MAX(FAVORITES) AS MAX_FAVORITES FROM REST_INFO GROUP BY FOOD_TYPE) B
  JOIN REST_INFO A
  ON A.FOOD_TYPE = B.FOOD_TYPE
  WHERE A.FAVORITES = B.MAX_FAVORITES
  ORDER BY A.FOOD_TYPE DESC;

3. 코드 해석
해당 문제는 REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류(FOOD_TYPE), ID(REST_ID), 식당 이름(REST_NAME), 즐겨찾기수(FAVORITES)를 조회하기 위해 SELECT~FROM문을 사용한다. 이때 GROUP BY절을 활용하여 음식종류(FOOD_TYPE)로 그룹화하고, MAX()함수를 사용하여 음식종류별 즐겨찾기수(FAVORITES)가 가장 많은 음식종류(FOOD_TYPE)와 즐겨찾기수(FAVORITES)를 조회하는 SELECT~FROM문을 만든다(B테이블). B테이블과 REST_INFO테이블을 내부 조인(INNER JOIN)을 활용하여 즐겨찾기수(FAVORITES)로 묶어서 WHERE 조건으로 음식종류별로 즐겨찾기수가 가장 많은 식당을 조회한다. 음식 종류(FOOD_TYPE)를 기준으로 나열해야 되므로 ORDER BY절과 내림차순 정렬인 DESC를 추가한다.


📌 Level 4

🟩 입양 시각 구하기(2)

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

WITH RECURSIVE HOUR_TABLE AS(
    SELECT 0 AS HOUR
    UNION ALL
    SELECT HOUR+1 FROM HOUR_TABLE WHERE HOUR < 23
)
SELECT HOUR_TABLE.HOUR, COUNT(ANIMAL_ID) AS COUNT
FROM HOUR_TABLE
LEFT OUTER JOIN ANIMAL_OUTS
ON HOUR(DATETIME) = HOUR_TABLE.HOUR
GROUP BY HOUR_TABLE.HOUR
ORDER BY HOUR_TABLE.HOUR;

3. 코드 해석

🟩 식품분류별 가장 비싼 식품의 정보 조회하기

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

SELECT CATEGORY, PRICE AS MAX_PRICE, PRODUCT_NAME
  FROM FOOD_PRODUCT
  WHERE CATEGORY IN ('과자', '국', '김치', '식용유') AND PRICE IN (SELECT MAX(PRICE) FROM FOOD_PRODUCT GROUP BY CATEGORY) 
  ORDER BY MAX_PRICE DESC;

3. 코드 해석

🟩 년, 월, 성별 별 상품 구매 회원 수 구하기

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

SELECT YEAR(SALES_DATE) AS YEAR, MONTH(SALES_DATE) AS MONTH, GENDER, COUNT(DISTINCT(A.USER_ID)) AS USERS
  FROM USER_INFO A
  JOIN ONLINE_SALE B
  ON A.USER_ID = B.USER_ID
  WHERE GENDER IS NOT NULL
  GROUP BY YEAR, MONTH, GENDER
  ORDER BY YEAR ASC, MONTH ASC, GENDER ASC;

3. 코드 해석


profile
The ultimate goal is to be a Data Scientist.

0개의 댓글