문제

📌 MySQL 으로 풀이

 

📌 문제 링크 :

 

프로그래머스

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

programmers.co.kr

 

📌 문제 설명 :

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
INTAKE_CONDITION VARCHAR(N) FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_INTAKE VARCHAR(N) FALSE

가장 최근에 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.

 


풀이

추측) 

가장 최근이라는 시간을 MAX로 구하는게 될까 싶어 바로 적용

 

쿼리) 

* 1차) 

SELECT MAX(DATETIME) AS '시간'
FROM ANIMAL_INS

 

리뷰) 

이걸 기록하는 이유는 이론상으로는 시간이 쌓이니까 MAX함수로 구하는게 맞는 거 같긴한데.. (제목도 최댓값 구하기지만 ㅎㅎ)

근데 이게 되네? 싶어 기록해본다.

문제

📌 MySQL 으로 풀이

 

📌 문제 링크 :

 

프로그래머스

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

programmers.co.kr

 

📌 문제 설명 :

FOOD_PRODUCT 테이블에서 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회하는 SQL문을 작성해주세요. 이때 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력시켜 주시고 결과는 식품 가격을 기준으로 내림차순 정렬해주세요.

 

📌 테이블 :

다음은 식품의 정보를 담은 FOOD_PRODUCT 테이블입니다. FOOD_PRODUCT 테이블은 다음과 같으며 PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE는 식품 ID, 식품 이름, 식품코드, 식품분류, 식품 가격을 의미합니다.

PRODUCT_ID VARCHAR(10) FALSE
PRODUCT_NAME VARCHAR(50) FALSE
PRODUCT_CD VARCHAR(10) TRUE
CATEGORY VARCHAR(10) TRUE
PRICE NUMBER TRUE

풀이

추측) 

먼저 카테고리 별 최고값을 서브쿼리고 검색하고 where절로 이와 일치하는 row를 찾아 출력하는 방식으로 진행

 

쿼리) 

* 1차) 성공

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

 

리뷰) 

 

WHERE에서 IN 연산자 쓸때 () 안에 컬럼을 맞춰주면 여러개를 일치하는 걸 찾아줄 수 있다. 

 

IN 연산자는 다중행 연산자로 다중행 연산자에는 아래와 같은 종류가 있다. 

연산자 기   능
IN  서브쿼리에서 여러개의 결과 중 하나만 일치하면 참
ANY  서브쿼리에서 여러개의 결과 중에 조건에 맞는 것이 하나 이상 있으면 참
(=ANY는 IN과 동일, 하지만 조건에 >= 등의 부등호가 들어가면 IN과 달라짐)
ALL 서브쿼리에서 여러개의 결과에 조건이 맞으면 참

 

문제

📌 MySQL 으로 풀이

 

📌 문제 링크 :

 

프로그래머스

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

programmers.co.kr

 

📌 문제 설명 :

USED_GOODS_BOARD와 USED_GOODS_USER 테이블에서 완료된 중고 거래의 총금액이 70만 원 이상인 사람의 회원 ID, 닉네임, 총거래금액을 조회하는 SQL문을 작성해주세요. 결과는 총거래금액을 기준으로 오름차순 정렬해주세요.

 

 

📌 테이블 :

다음은 중고 거래 게시판 정보를 담은 USED_GOODS_BOARD 테이블과 중고 거래 게시판 첨부파일 정보를 담은 USED_GOODS_FILE 테이블입니다. USED_GOODS_BOARD 테이블은 다음과 같으며 BOARD_ID, WRITER_ID, TITLE, CONTENTS, PRICE, CREATED_DATE, STATUS, VIEWS는 게시글 ID, 작성자 ID, 게시글 제목, 게시글 내용, 가격, 작성일, 거래상태, 조회수를 의미합니다.

BOARD_ID VARCHAR(5) FALSE
WRITER_ID VARCHAR(50) FALSE
TITLE VARCHAR(100) FALSE
CONTENTS VARCHAR(1000) FALSE
PRICE NUMBER FALSE
CREATED_DATE DATE FALSE
STATUS VARCHAR(10) FALSE
VIEWS NUMBER FALSE

USED_GOODS_USER 테이블은 다음과 같으며 USER_ID, NICKNAME, CITY, STREET_ADDRESS1, STREET_ADDRESS2, TLNO는 각각 회원 ID, 닉네임, 시, 도로명 주소, 상세 주소, 전화번호를 를 의미합니다.

USER_ID VARCHAR(50) FALSE
NICKANME VARCHAR(100) FALSE
CITY VARCHAR(100) FALSE
STREET_ADDRESS1 VARCHAR(100) FALSE
STREET_ADDRESS2 VARCHAR(100) TRUE
TLNO VARCHAR(20) FALSE

 

 


풀이

소스코드) 

* 1차) 성공

SELECT U.USER_ID, U.NICKNAME, SUM(PRICE) AS TOTAL_SALES
FROM USED_GOODS_BOARD AS B
INNER JOIN USED_GOODS_USER AS U
ON B.WRITER_ID = U.USER_ID
WHERE B.STATUS = 'DONE'
GROUP BY U.USER_ID
HAVING TOTAL_SALES >= 700000
ORDER BY TOTAL_SALES ASC

 

리뷰) 

 

where하고 having이 거르는 차이점에 대해서 알 수 있는 문제

where은 그룹화 하기 전에 필터링 하여 거래가 끝난지를 판단하여 필터링하고

having은 거래 끝난 걸 대상으로 그룹화하여 테이블을 만들면 거기서 총액의 70만 이상인걸 필터링한다.

📌 MySQL 으로 풀이

 

📌 문제 링크 :

 

프로그래머스

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

programmers.co.kr

 

📌 문제 설명 :

USED_GOODS_BOARD 테이블에서 2022년 10월 5일에 등록된 중고거래 게시물의 게시글 ID, 작성자 ID, 게시글 제목, 가격, 거래상태를 조회하는 SQL문을 작성해주세요. 거래상태가 SALE 이면 판매중, RESERVED이면 예약중, DONE이면 거래완료 분류하여 출력해주시고, 결과는 게시글 ID를 기준으로 내림차순 정렬해주세요.

 

다음은 중고거래 게시판 정보를 담은 USED_GOODS_BOARD 테이블입니다. USED_GOODS_BOARD 테이블은 다음과 같으며 BOARD_ID, WRITER_ID, TITLE, CONTENTS, PRICE, CREATED_DATE, STATUS, VIEWS은 게시글 ID, 작성자 ID, 게시글 제목, 게시글 내용, 가격, 작성일, 거래상태, 조회수를 의미합니다.

BOARD_ID VARCHAR(5) FALSE
WRITER_ID VARCHAR(50) FALSE
TITLE VARCHAR(100) FALSE
CONTENTS VARCHAR(1000) FALSE
PRICE NUMBER FALSE
CREATED_DATE DATE FALSE
STATUS VARCHAR(10) FALSE
VIEWS NUMBER FALSE

 


추측) 

SQL에서의 조건문을 사용하는 데 중점인 문제인듯하다. 

상태가 3가지 이므로 CASE WHEN 케이스로!

 

쿼리) 

* 1차) 

SELECT 
    BOARD_ID, 
    WRITER_ID, 
    TITLE, PRICE, 
    CASE 
        WHEN STATUS = 'SALE' THEN '판매중'
        WHEN STATUS = 'RESERVED' THEN '예약중' 
		ELSE '거래완료' 
    END AS STATUS
FROM USED_GOODS_BOARD 
WHERE CREATED_DATE LIKE '2022-10-05%'
ORDER BY BOARD_ID DESC

 

리뷰) 

SQL에서 조건문을 사용할때는

1. IF(조건문, 참일때 값, 거짓일때 값) 

2. IFNULL(null판단 값, null이면 출력될 값)

3. CASE WHEN 조건문 THEN 참일때 값 ELSE 거짓일때 값 END

등의 함수나 키워드가 있다. 

 

특히 3번에서 when이랑 then은 여러번 사용할 수 있고 else는 모든 조건이 아닐시 출력되는 값을 쓰는 거라 java의 switch에 가깝다. 

그리고 이 조건문들은 중첩이 가능하다. 

📌 MySQL 으로 풀이

 

📌 문제 링크 :

 

프로그래머스

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

programmers.co.kr

 

📌 문제 설명 :

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 평균 대여 기간이 7일 이상인 자동차들의 자동차 ID와 평균 대여 기간(컬럼명: AVERAGE_DURATION) 리스트를 출력하는 SQL문을 작성해주세요. 평균 대여 기간은 소수점 두번째 자리에서 반올림하고, 결과는 평균 대여 기간을 기준으로 내림차순 정렬해주시고, 평균 대여 기간이 같으면 자동차 ID를 기준으로 내림차순 정렬해주세요.

 

다음은 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블입니다. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블은 아래와 같은 구조로 되어있으며, HISTORY_ID, CAR_ID, START_DATE, END_DATE 는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.

HISTORY_ID INTEGER FALSE
CAR_ID INTEGER FALSE
START_DATE DATE FALSE
END_DATE DATE FALSE

 

 


추측) 

car_id를 기준으로 그룹화 하는데

having을 통해 그룹 통계에서 렌탈 종료날짜에서 시작날짜와의 차이들의 평균을 내어 7일 이상인 경우만을 필터링

그리고 car_id와 평균을 2번째 소수점 자리에서 반올림한 값을 출력할 수 있게 round함수까지 사용하면 될거 같다.

 

 

쿼리) 

* 1차) 실패

SELECT CAR_ID, ROUND(AVG(END_DATE - START_DATE),1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVG(END_DATE - START_DATE) >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC

* 2차) 성공

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 AVG(DATEDIFF(END_DATE, START_DATE) + 1) >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC

 

리뷰) 

단순히 date날짜끼리 - 한다해서 값이 나오지 않는다. 

DATEDIFF 함수로 날짜 차이를 구해야 정확한 날짜 차이가 계산된다. 

그리고 DATEDIFF 의 차이로는 처음 시작 날짜가 포함되지 않으니 +1이 필요하다!

(날짜 계산할 때 이거 항상 조심해야할 듯)

+ Recent posts