프로그래머스 스쿨 SQL 고득점KIT_SELECT 답안지 (MYSQL)

* 붙여넣는 과정에서 일부 정렬이 흐트러져있을 수 있습니다
* 풀이 중에 헷갈렸거나 어려웠던 부분, 나중에 알게된 부분 등을 간단하게 적어두었습니다

프로그래머스 스쿨 SQL 고득점 KIT - SELECT 모든문제 풀이 완료 인증 사진

  1. 평균 일일 데이터 구하기
    • AVG() 함수 생각을 못해서 코드가 길어졌다
SELECT
    ROUND((SUM(DAILY_FEE)/COUNT(*))) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV'

  1. 3월에 태어난 여성 회원 목록 출력하기
    • 조건 중에 '여성' 회원이라는 점과 날짜 포맷을 맞춰야한다는 것을 놓쳐서 헤맸다. -> 코테에서는 조건을 주의깊게 볼 필요가 있겠다
SELECT
    MEMBER_ID
    ,MEMBER_NAME
    ,GENDER
    ,DATE_FORMAT(DATE_OF_BIRTH,'%Y-%m-%d') AS DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE MONTH(DATE_OF_BIRTH) = '3'
    AND GENDER = 'W'
    AND TLNO IS NOT NULL
ORDER BY MEMBER_ID ASC
  1. 서울에 위치한 식당 목록 출력하기
    1. LEFT JOIN을 사용했는데 INNER JOIN으로 사용했어야 했다
SELECT
    RI.REST_ID
    ,RI.REST_NAME
    ,RI.FOOD_TYPE
    ,RI.FAVORITES
    ,RI.ADDRESS
    ,ROUND(AVG(RR.REVIEW_SCORE),2) AS SCORE
FROM REST_INFO RI
    INNER JOIN REST_REVIEW RR ON RI.REST_ID = RR.REST_ID
WHERE SUBSTRING(RI.ADDRESS,1,2) = '서울'
GROUP BY RI.REST_ID
ORDER BY SCORE DESC, RI.FAVORITES DESC

  1. 강원도에 위치한 생산공장 목록 출력하기
SELECT
    FACTORY_ID
    ,FACTORY_NAME
    ,ADDRESS
FROM FOOD_FACTORY
WHERE SUBSTRING(ADDRESS,1,3) = '강원도'
ORDER BY FACTORY_ID ASC

  1. 12세 이하인 여자 환자 목록 출력하기
SELECT
    PT_NAME
    ,PT_NO
    ,GEND_CD
    ,AGE
    ,IFNULL(TLNO,'NONE')
FROM PATIENT
WHERE AGE <= 12
    AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC

  1. 흉부외과 또는 일반외과 의사 목록 출력하기
SELECT
    DR_NAME
    ,DR_ID
    ,MCDP_CD
    ,DATE_FORMAT(HIRE_YMD,'%Y-%m-%d') AS HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD IN ('CS','GS')
ORDER BY HIRE_YMD DESC, DR_NAME ASC

  1. 과일로 만든 아이스크림 고르기
SELECT
    FH.FLAVOR
FROM FIRST_HALF FH
INNER JOIN ICECREAM_INFO II
    ON FH.FLAVOR = II.FLAVOR
WHERE FH.TOTAL_ORDER > 3000
    AND II.INGREDIENT_TYPE = 'fruit_based'
ORDER BY FH.TOTAL_ORDER DESC

1. 조건에 맞는 도서 리스트 출력하기

SELECT
    BOOK_ID
    , DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK
WHERE PUBLISHED_DATE LIKE '2021%'
    AND CATEGORY = '인문'
ORDER BY PUBLISHED_DATE ASC

1. 모든 레코드 조회하기

SELECT
    *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC

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

WITH T_ON AS (
    SELECT
        DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE
        , PRODUCT_ID
        , USER_ID
        , SALES_AMOUNT
    FROM ONLINE_SALE
), T_OFF AS (
    SELECT
        DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE
        , PRODUCT_ID
        , NULL AS USER_ID
        , SALES_AMOUNT
    FROM OFFLINE_SALE
)
SELECT 
    TMP.SALES_DATE
    , TMP.PRODUCT_ID
    , TMP.USER_ID
    , TMP.SALES_AMOUNT
FROM (
    SELECT * FROM T_ON
        UNION ALL
    SELECT * FROM T_OFF
) TMP
WHERE TMP.SALES_DATE LIKE '2022-03%'
	ORDER BY TMP.SALES_DATE ASC, TMP.PRODUCT_ID ASC, TMP.USER_ID ASC

1. 아픈 동물 찾기

  • 테이블의 정보를 잘못봐서 ‘아픈’ 동물인 조건이 제외되었었다
SELECT
    ANIMAL_ID
    , NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION = 'sick'
ORDER BY ANIMAL_ID

1. 어린 동물 찾기

SELECT
    ANIMAL_ID, 
    NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION NOT IN ('Aged')
ORDER BY ANIMAL_ID

1. 동물의 아이디와 이름

SELECT
    ANIMAL_ID
    , NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

1. 여러기준으로 정렬하기

SELECT
ANIMAL_ID
, NAME
, DATETIME
FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC

1. 상위 n개 레코드

SELECT
    NAME
FROM ANIMAL_INS
ORDER BY DATETIME ASC
LIMIT 1

1. 조건에 맞는 회원수 구하기

SELECT
    COUNT(*)
FROM USER_INFO
WHERE JOINED LIKE '2021%'
    AND AGE BETWEEN 20 AND 29

 

1. 인기있는 아이스크림

SELECT
    FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID

1. 재구매가 일어난 상품과 회원 리스트 구하기

  • 2시간 헤매고 결국 답변봄
  • GROUP BY에 다중 값을 줄 수 있다는 사실을 몰라서 1차 헤맸고, 조건에 맞는 코드를 제대로 생각해내지 못했다
SELECT 
    USER_ID, PRODUCT_ID
FROM
    ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
    HAVING COUNT(PRODUCT_ID) > 1
ORDER BY USER_ID, PRODUCT_ID DESC

1. 역순 정렬하기

SELECT
    NAME
    , DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC