Step-by-Step

[프로그래머스] SQL 도장깨기 (Level 2) 본문

언어/MySQL

[프로그래머스] SQL 도장깨기 (Level 2)

희주(KHJ) 2023. 4. 26. 20:51
SQL 프로그래머스 2레벨 도장깨기

 

 

 

# 가격대 별 상품 개수 구하기  https://school.programmers.co.kr/learn/courses/30/lessons/131530

  • 만원 단위로 가격대 별 상품 개수 구하기
  • Floor로 가격 내림 적용한 가상 테이블 만들고, Group으로 묶어서 count 해줌
WITH CHG AS (
    SELECT PRODUCT_ID, FLOOR(PRICE/10000) * 10000 AS PRICES
    FROM PRODUCT
    GROUP BY PRICE
)

SELECT FLOOR(PRICE/10000)*10000 AS PRICE_GROUP, COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP

 

 

# 카테고리 별 상품 구하기 https://school.programmers.co.kr/learn/courses/30/lessons/131529

  • SUBSTR로 상품 코드 앞 자리 2개 String 가져옴
  • 상품코드 앞자리 같은 것끼리 묶은 후 CNT
SELECT SUBSTR(PRODUCT_CODE,1,2) AS CATEGORY, COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY CATEGORY
ORDER BY CATEGORY

 

 

# 가격이 제일 비싼 식품의 정보 출력하기 https://school.programmers.co.kr/learn/courses/30/lessons/131115

  • FOOD_PRODUCT의 MAX 가격과 일치하는 PRICE를 가진 행 출력
SELECT * FROM FOOD_PRODUCT
WHERE PRICE = (SELECT MAX(PRICE) FROM FOOD_PRODUCT)

 

 

# DATETIME에서 DATE로 형 변환 https://school.programmers.co.kr/learn/courses/30/lessons/59414

  • DATE_FORMAT 이용해서 형식 만들어주기
SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, "%Y-%m-%d")
FROM ANIMAL_INS

 

 

# 입양 시각 구하기(1) https://school.programmers.co.kr/learn/courses/30/lessons/59412

  • 09시부터 20시 전까지 시간대 순으로 입양 개수 나열
  • HOUR가 9 -19 인 경우만 추출 및 HOUR 기준으로 GROUP BY 함
SELECT DATE_FORMAT(DATETIME, "%H") AS HOUR, COUNT(*)
FROM ANIMAL_OUTS
GROUP BY HOUR HAVING HOUR BETWEEN 9 AND 19
ORDER BY HOUR

 

 

# NULL 처리하기 https://school.programmers.co.kr/learn/courses/30/lessons/59410

  • NAME이 NULL 허용인데, SELECT 시 NULL이면 "No name"으로 출력
SELECT ANIMAL_TYPE,
CASE
    WHEN NAME IS NULL
    THEN "No name"
    ELSE NAME
END AS NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS

 

 

# 중성화 여부 파악하기 https://school.programmers.co.kr/learn/courses/30/lessons/59409

  • CASE와 LIKE 써서 Neutered나 Spayed 들어간 행은 O로 표시하기
  • 나머지는 X로 표시
SELECT ANIMAL_ID, NAME,
CASE 
    WHEN SEX_UPON_INTAKE LIKE '%Neutered%'  
    THEN "O" 
    WHEN SEX_UPON_INTAKE LIKE '%Spayed%'
    THEN "O"
    ELSE "X" 
END AS "중성화"
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC

 

 

# 중복 제거하기 https://school.programmers.co.kr/learn/courses/30/lessons/59408

  • WHERE로 NULL 값인 경우 제외하기
  • DISTINCT로 NAME 중복 제거
SELECT COUNT(DISTINCT NAME) FROM ANIMAL_INS WHERE NAME IS NOT NULL;

 

 

# 고양이와 개는 몇 마리 있을까 https://school.programmers.co.kr/learn/courses/30/lessons/59406

  • ANIMAL_TYPE 기준 GROUP BY하고 COUNT 해주기
SELECT ANIMAL_TYPE,COUNT(ANIMAL_TYPE)
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE

 

 

# 이름에 el이 들어가는 동물 찾기 https://school.programmers.co.kr/learn/courses/30/lessons/59047

  • 타입이 DOG이고 이름(소문자 치환)가 어쩌고 el 어쩌고인 경우 출력
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE LOWER(NAME) LIKE '%el%' AND ANIMAL_TYPE = "Dog"
ORDER BY NAME ASC;

 

 

# 자동차 평균 대여 기간 구하기 https://school.programmers.co.kr/learn/courses/30/lessons/157342

  • DATEDIFF는 빼기 개념이라 +1 해주어야 함
  • 평균 대여기간 7일 이상인 경우만 선택
SELECT CAR_ID, 
ROUND(AVG(DATEDIFF(END_DATE, START_DATE))+1,1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID HAVING AVERAGE_DURATION >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC

 

 

# 자동차 종류별 특정 옵션이 포함된 자동차 수 구하기 https://school.programmers.co.kr/learn/courses/30/lessons/151137

  • WHERE절로 특정 옵션 포함된 것만 가져오기
  • HAVING으로 개수가 0개 이상인것만 가져오기
SELECT CAR_TYPE, COUNT(CAR_ID) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE '%통풍시트%'
    OR OPTIONS LIKE '%열선시트%'
    OR OPTIONS LIKE '%가죽시트%'
GROUP BY CAR_TYPE HAVING CARS > 0
ORDER BY CAR_TYPE ASC

 

 

 

# 조건에 맞는 도서와 저자 리스트 출력하기 https://school.programmers.co.kr/learn/courses/30/lessons/144854 

    • WHERE로 경제 카테고리 가져오기 및 같은 저자 아이디인 행 출력
    • DATE_FORMAT으로 년/월/일 로 맞춤
    SELECT B.BOOK_ID, A.AUTHOR_NAME, DATE_FORMAT(B.PUBLISHED_DATE, "%Y-%m-%d") AS PUBLISHED_DATE
    FROM BOOK AS B, AUTHOR AS A
    WHERE B.AUTHOR_ID = A.AUTHOR_ID AND B.CATEGORY = '경제'
    ORDER BY B.PUBLISHED_DATE ASC

     

     

     

     

    # 재구매가 일어난 상품과 회원 리스트 구하기 https://school.programmers.co.kr/learn/courses/30/lessons/131536

    • GROUP BY 여러 개 사용가능, 먼저 묶을 순서대로 정해주기 USER_ID > PRODUCT_ID
    • 단, 그룹으로 묶었을 때 행의 개수가 1 이상인 경우 (그룹 내 요소들이 1 초과인 경우)만 채택
    SELECT USER_ID, PRODUCT_ID 
    FROM ONLINE_SALE
    GROUP BY USER_ID, PRODUCT_ID HAVING COUNT(*)>1
    ORDER BY USER_ID ASC, PRODUCT_ID DESC;

     

     

    진료과별 총 예약 횟수 출력하기  https://school.programmers.co.kr/learn/courses/30/lessons/132202

    • 별칭 줄때 백쿼트(`) 자주 사용하자 그리고 띄어쓰기 없으면 백쿼트 사용 안 해도 됨
    • LIKE로 추출
    SELECT MCDP_CD AS `진료과 코드`, COUNT(*) AS `5월예약건수`
    FROM APPOINTMENT
    WHERE APNT_YMD LIKE '2022-05%'
    GROUP BY MCDP_CD
    ORDER BY `5월예약건수` ASC, `진료과 코드` ASC;

     

     

    상품 별 오프라인 매출 구하기 https://school.programmers.co.kr/learn/courses/30/lessons/131533

    • 오프라인 매출이 없는 경우가 있을 수 있으니 INNER JOIN 사용!!
    SELECT A.PRODUCT_CODE, SUM(A.PRICE * B.SALES_AMOUNT) AS SALES
    FROM PRODUCT AS A
    INNER JOIN OFFLINE_SALE AS B ON A.PRODUCT_ID = B.PRODUCT_ID
    GROUP BY A.PRODUCT_CODE
    ORDER BY SALES DESC, A.PRODUCT_CODE ASC;

     

    3월에 태어난 여성 회원 목록 출력하기  https://school.programmers.co.kr/learn/courses/30/lessons/131120

    • DATE_FORMAT 사용해서 형식 갖추고, MONTH이용해서 월 추출하기
    SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_FORMAT(DATE_OF_BIRTH, "%Y-%m-%d") AS DATE_OF_BIRTH
    FROM MEMBER_PROFILE
    WHERE MONTH(DATE_FORMAT(DATE_OF_BIRTH, "%Y-%m-%d")) = "3" AND TLNO IS NOT NULL AND GENDER = "W"
    ORDER BY MEMBER_ID;

     

    끝!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    '언어 > MySQL' 카테고리의 다른 글

    [프로그래머스] SQL 도장깨기 (Level 1)  (1) 2023.10.06
    Comments