[프로그래머스] SQL 고득점 키트 풀이 및 정리 - 3편 JOIN

Bini by Bini·2023년 4월 6일
0

코테

목록 보기
23/24

3편 - JOIN

[출제 빈도 : 높음, 평균 점수 : 낮음, 문제세트 : 11]

난이도 쉬운 순서, 풀이한 사람이 많은 순서로 풀이하겠다.

💥 상품 별 오프라인 매출 구하기

[Level 2]

-- 1
SELECT P.PRODUCT_CODE, SUM(O.SALES_AMOUNT * P.PRICE) AS SALES
FROM PRODUCT AS P, OFFLINE_SALE AS O
WHERE P.PRODUCT_ID = O.PRODUCT_ID
GROUP BY P.PRODUCT_ID
ORDER BY SALES DESC, P.PRODUCT_CODE

-- 2
SELECT P.PRODUCT_CODE, SUM(O.SALES_AMOUNT * P.PRICE) AS SALES
FROM PRODUCT AS P
    JOIN (SELECT PRODUCT_ID, SALES_AMOUNT
         FROM OFFLINE_SALE
    ) AS O
    ON P.PRODUCT_ID = O.PRODUCT_ID
GROUP BY P.PRODUCT_ID
ORDER BY SALES DESC, P.PRODUCT_CODE

-- 3
SELECT P.PRODUCT_CODE, SUM(O.SALES_AMOUNT * P.PRICE) AS SALES
FROM PRODUCT AS P
    JOIN OFFLINE_SALE AS O
    ON P.PRODUCT_ID = O.PRODUCT_ID
GROUP BY P.PRODUCT_ID
ORDER BY SALES DESC, P.PRODUCT_CODE

--4
SELECT P.PRODUCT_CODE, SUM(O.SALES_AMOUNT * P.PRICE) AS SALES
FROM PRODUCT AS P, OFFLINE_SALE AS O
WHERE P.PRODUCT_ID = O.PRODUCT_ID
GROUP BY O.PRODUCT_ID
ORDER BY SALES DESC, P.PRODUCT_CODE

이 문제는 풀 수 있는 방법이 굉장히 많다.

join기준 테이블을 더 간단한 PRODUCT 테이블로 지정하는 게 나을 것 같다.

💥 조건에 맞는 도서와 저자 리스트 출력하기

[Level 2]

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

❗ 주의사항을 조심하자. 출력예시와 같은 데이트포맷이 나와야 함.
DATE_FORMAT(컬럼명, 형식)

데이트와 포맷 사이에 언더바 있음. ㅋ.


💥 있었는데요 없었습니다

[Level 3]

-- 1
SELECT I.ANIMAL_ID, I.NAME
FROM ANIMAL_INS I, ANIMAL_OUTS O
WHERE I.ANIMAL_ID = O.ANIMAL_ID AND O.DATETIME < I.DATETIME
ORDER BY I.DATETIME

-- 2
SELECT I.ANIMAL_ID, I.NAME
FROM ANIMAL_INS AS I
    JOIN ANIMAL_OUTS AS O
    ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE O.DATETIME < I.DATETIME
ORDER BY I.DATETIME

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

[Level 3]

SELECT I.NAME, I.DATETIME
FROM ANIMAL_INS AS I
    LEFT JOIN ANIMAL_OUTS AS O
    ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE O.ANIMAL_ID IS NULL
ORDER BY I.DATETIME
LIMIT 3

LEFT JOIN을 걸어 ANIMAL_INS 테이블에는 있지만, ANIMAL_OUTS 테이블에는 없는 값을 찾는다.
(만약 그냥 JOIN 즉, INNTER JOIN을 건다면 공통된 값만 찾으므로 원하는 값을 찾을 수 없다.)

이후 보호시작일(I.DATETIME) 순으로 정렬하고, LIMIT 3을 통해 정렬된 데이터 중, 3개만 값을 가져온다.

*LEFT JOIN : 왼쪽 테이블을 기준으로 오른쪽 테이블을 조인


💥 보호소에서 중성화한 동물

[Level 4]

-- 1 LIKE 이용
SELECT I.ANIMAL_ID, I.ANIMAL_TYPE, I.NAME
FROM ANIMAL_INS AS I, ANIMAL_OUTS AS O
WHERE I.ANIMAL_ID = O.ANIMAL_ID
    AND I.SEX_UPON_INTAKE LIKE 'Intact%'
    AND (O.SEX_UPON_OUTCOME LIKE 'Spayed%'
         OR O.SEX_UPON_OUTCOME LIKE 'Neutered%')
ORDER BY I.ANIMAL_ID

-- 2 성별이 그대로
SELECT I.ANIMAL_ID, I.ANIMAL_TYPE, I.NAME
FROM ANIMAL_INS AS I, ANIMAL_OUTS AS O
WHERE I.ANIMAL_ID = O.ANIMAL_ID
    AND NOT I.SEX_UPON_INTAKE = O.SEX_UPON_OUTCOME
ORDER BY I.ANIMAL_ID

보호소에 들어왔을 때부터 이미 중성화가 되어있다면 I.SEX_UPON_INTAKE 값과 O.SEX_UPON_OUTCOME 값이 같을 것이므로, 이 두 값이 다른 경우를 찾으면 된다.

LIKE로 두개 조건 걸기

1) 둘 중 하나라도 만족하는 데이터 검색 : OR
2) 둘 다 만족하는 데이터 검색 : AND

아래 OR에 AND를 넣어주면 2번 구현 가능.

SELECT *
FROM 테이블
WHERE (컬럼명 LIKE 'A%' OR 컬럼명 LIKE 'B%')
SELECT *
FROM 테이블
WHERE (컬럼명 LIKE 'A%' OR 'B%')

이렇게는 안된다 ㅋ . 될 줄 알았는데 안 되길래 위에 거겠군 하고 바꿔서 구현했습니다.


시간이 되면 나머지 문제에 대해서도 풀이 ..

profile
My Precious Records

0개의 댓글