[SQL][프로그래머스] JOIN 문제 풀이
728x90

그룹별 조건에 맞는 식당 목록 출력하기

 

프로그래머스

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

programmers.co.kr

-- 가장 많이 쓴 리뷰 개수를 쓴 사람의 이름, 리뷰, 날짜 구하기
SELECT M.MEMBER_NAME, R.REVIEW_TEXT, DATE_FORMAT(R.REVIEW_DATE, "%Y-%m-%d") REVIEW_DATE
FROM MEMBER_PROFILE M INNER JOIN REST_REVIEW R
ON M.MEMBER_ID = R.MEMBER_ID
WHERE R.MEMBER_ID IN
	-- 가장 많이 쓴 리뷰 개수를 쓴 사람 구하기
    (SELECT MEMBER_ID FROM REST_REVIEW GROUP BY MEMBER_ID HAVING COUNT(*) =
    	-- 가장 많이 쓴 리뷰 개수 구하기
        (SELECT MAX(CNT) FROM
        	-- 리뷰 개수 구하기
            (SELECT COUNT(*) AS CNT FROM REST_REVIEW GROUP BY MEMBER_ID) A
        )
     )
ORDER BY R.REVIEW_DATE ASC;

1.  DATE_FORMAT(R.REVIEW_DATE, "%Y-%m-%d")

2. JOIN 쓴 뒤에는 ON 빼먹지 않기

3. FROM절에 서브쿼리가 있다면 무조건 정의해 줘야 한다 (= A)

 

5월 식품들의 총 매출 조회하기

 

프로그래머스

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

programmers.co.kr

SELECT FP.PRODUCT_ID, FP.PRODUCT_NAME, FO.AMOUNT*FP.PRICE AS TOTAL_SALES
FROM FOOD_PRODUCT FP JOIN
    (SELECT PRODUCT_ID, SUM(AMOUNT) AS AMOUNT, PRODUCE_DATE
     FROM FOOD_ORDER
     WHERE LEFT(PRODUCE_DATE, 7) = '2022-05'
     GROUP BY PRODUCT_ID) FO
ON FP.PRODUCT_ID = FO.PRODUCT_ID
ORDER BY TOTAL_SALES DESC, PRODUCT_ID;

SELECT FP.PRODUCT_ID, FP.PRODUCT_NAME, SUM(FO.AMOUNT*FP.PRICE) AS TOTAL_SALES
FROM FOOD_PRODUCT FP JOIN FOOD_ORDER FO
ON FP.PRODUCT_ID = FO.PRODUCT_ID
WHERE LEFT(FO.PRODUCE_DATE, 7) = '2022-05'
GROUP BY PRODUCT_ID
ORDER BY TOTAL_SALES DESC, PRODUCT_ID;

1. HAVING vs WHERE

 - HAVING을 쓰게 되면 GROUP BY 된 이후 특정한 필드로 그룹회된 새로운 테이블에 조건을 준다

 - WHERE은 우선적으로 모든 필드를 조건에 둘 수 있다 => 이 문제에서는 WHERE로 풀어야 함

 - 전체 테이블 자체에서 쿼리를 수행하고 싶다면 WHERE을, 전체 테이블을 그룹화한 뒤 조건을 걸고 싶다면 HAVING 사용

 

없어진 기록 찾기

 

프로그래머스

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

programmers.co.kr

-- ANIMALS_OUTS과 ANIMALS_INS에서 같지 않은 컬럼 서브쿼리
-- 동물의 ID와 이름을 ID순으로 조회

SELECT ANIMAL_ID, NAME
FROM ANIMAL_OUTS
WHERE ANIMAL_ID NOT IN (SELECT ANIMAL_ID FROM ANIMAL_INS)
ORDER BY ANIMAL_ID

 

있었는데요 없었습니다

 

프로그래머스

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

programmers.co.kr

SELECT I.ANIMAL_ID, I.NAME
FROM ANIMAL_INS I LEFT JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.DATETIME > O.DATETIME
ORDER BY I.DATETIME

 

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

 

프로그래머스

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

programmers.co.kr

-- 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일
-- 보호 시작일 순으로 조회

-- 아직 입양 못 간 동물(NOT IN) 찾은 뒤 보호 시작일 순으로 정렬해 LIMIT 3

SELECT NAME, DATETIME
FROM ANIMAL_INS
WHERE ANIMAL_ID NOT IN (SELECT ANIMAL_ID FROM ANIMAL_OUTS)
ORDER BY DATETIME
LIMIT 3;

 

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

 

프로그래머스

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

programmers.co.kr

-- 상품코드별 매출액(판매가 * 판매량) 합계
-- 매출액 내림차순, 상품코드 오름차순

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

 

상품을 구매한 회원 비율 구하기

 

프로그래머스

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

programmers.co.kr

-- 2021년에 가입한 전체 회원들 중 상품을 구매한 회원 수
-- 상품을 구매한 비율(구매한 수 / 전체 회원수) 소수점 두번째자리에서 반올림
-- 년, 월별로 출력(GROUP BY)
-- 년 기준 오름차순, 월 기준 오름차순(ORDER BY)

SELECT YEAR(SALES_DATE) AS YEAR, MONTH(SALES_DATE) AS MONTH,
    COUNT(DISTINCT OS.USER_ID) AS PUCHASED_USERS,
    ROUND(COUNT(DISTINCT OS.USER_ID) /
          (SELECT COUNT(*) FROM USER_INFO WHERE YEAR(JOINED) = 2021),1) AS PUCHASED_RATIO
FROM ONLINE_SALE OS LEFT JOIN USER_INFO UI
ON OS.USER_ID = UI.USER_ID
WHERE YEAR(UI.JOINED) = 2021
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH;

1. FROM 절에 서브쿼리 쓸 때랑 SELECT 절에 서브쿼리 쓸 곳 구분하기

 - SUM과 ID만 구할 때는 굳이 FROM절에 서브쿼리 쓰지 않아도 됨

2. DISTINCT는 COUNT 안에 쓰기

3. COUNT(*) 남발하지 않기 웬만하면 ID로 계산하기

728x90