[SQL] 프로그래머스 SQL 고득점 KIT 문제 풀이_JOIN

bin1225·2024년 11월 20일
0

DATABASE

목록 보기
19/19
post-thumbnail

조건에 맞는 도서와 저자 리스트 출력하기(Level 2)

문제

'경제' 카테고리에 속하는 도서들의 도서 ID(BOOK_ID), 저자명(AUTHOR_NAME), 출판일(PUBLISHED_DATE) 리스트를 출력하는 SQL문을 작성해주세요.
결과는 출판일을 기준으로 오름차순 정렬해주세요.

코드

SELECT BOOK_ID, AUTHOR_NAME, DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK A
JOIN AUTHOR B
ON A.AUTHOR_ID = B.AUTHOR_ID
WHERE CATEGORY = '경제'
ORDER BY PUBLISHED_DATE;

없어진 기록 찾기(Level 3)

문제

천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.

코드

SELECT B.ANIMAL_ID, B.NAME
FROM ANIMAL_INS A
RIGHT JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.DATETIME IS NULL
ORDER BY B.ANIMAL_ID;

ANIMAL_OUTS에만 정보가 있는 데이터를 출력해야 한다.
따라서 JOIN시 INS정보가 없다면 NULL값으로 표시되도록 RIGHT JOIN을 한다.


있었는데요 없었습니다(Level 3)

문제

관리자의 실수로 일부 동물의 입양일이 잘못 입력되었습니다. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일이 빠른 순으로 조회해야합니다.

코드

SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS A
JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.DATETIME > B.DATETIME
ORDER BY A.DATETIME;

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

문제

아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.

코드

SELECT A.NAME, A.DATETIME
FROM ANIMAL_INS A
LEFT JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL
ORDER BY A.DATETIME
LIMIT 3;

상품 별 오프라인 매출 구하기(Level 2)

문제

PRODUCT 테이블과 OFFLINE_SALE 테이블에서 상품코드 별 매출액(판매가 * 판매량) 합계를 출력하는 SQL문을 작성해주세요. 결과는 매출액을 기준으로 내림차순 정렬해주시고 매출액이 같다면 상품코드를 기준으로 오름차순 정렬해주세요.

코드

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

보호소에서 중성화한 동물(Level 4)

문제

보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다. 보호소에 들어올 당시에는 중성화1되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성해주세요.

코드

SELECT A.ANIMAL_ID, A.ANIMAL_TYPE, A.NAME
FROM ANIMAL_INS A
JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.SEX_UPON_INTAKE LIKE "Intact%"
AND B.SEX_UPON_OUTCOME != A.SEX_UPON_INTAKE
ORDER BY A.ANIMAL_ID;

특정 기간동안 대여 가능한 자동차들의 대여비용 구하기(Level 4)

문제

CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '세단' 또는 'SUV' 인 자동차 중 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하고 30일간의 대여 금액이 50만원 이상 200만원 미만인 자동차에 대해서 자동차 ID, 자동차 종류, 대여 금액(컬럼명: FEE) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 자동차 종류를 기준으로 오름차순 정렬, 자동차 종류까지 같은 경우 자동차 ID를 기준으로 내림차순 정렬해주세요.

코드

SELECT DISTINCT A.CAR_ID, A.CAR_TYPE, ROUND(A.DAILY_FEE * 30 * (100-C.DISCOUNT_RATE)/100) AS FEE
FROM CAR_RENTAL_COMPANY_CAR A
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY B
ON A.CAR_ID = B.CAR_ID
JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN C
ON A.CAR_TYPE = C.CAR_TYPE 
WHERE A.CAR_TYPE IN ('세단', 'SUV')
AND A.CAR_ID NOT IN(
    SELECT CAR_ID 
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE END_DATE > '2022-11-01' AND START_DATE < '2022-12-01'
)
AND C.DURATION_TYPE = '30일 이상'
AND A.DAILY_FEE * (100-C.DISCOUNT_RATE)/100 * 30 BETWEEN 500000 AND 2000000
ORDER BY FEE DESC, A.CAR_TYPE, A.CAR_ID DESC;
;

날짜 조건 설정이 헷갈렸다.
START_DATEEND_DATE가 22-11-1 과 22-11-30 사이에 하나라도 존재하면 불가능하다고 판단했는데 그렇게 작성하면 정답이 나오지 않는다.
-> START_DATE가 11월 이전 END_DATE가 11-30 이후인 경우도 자동차를 해당 기간에 이용할 수 없는 경우이기 때문..


여러 테이블의 정보가 필요한 경우 JOIN을 이용할 수 있다.
필요에 따라 LEFT JOIN이나 RIGHT JOIN을 이용하여 특정 테이블 값은 확정으로 가져올 수 있다.

2개의 댓글

comment-user-thumbnail
2024년 11월 20일

이야.. .이정도면 앵간한 실무는 쌉가능...

1개의 답글