[프로그래머스] JOIN 문제 정리

🌹Haeri Lee·2023년 1월 23일
0

[MySql] 문제풀이

목록 보기
14/15

☑️ 5월 식품들의 총매출 조회하기
FOOD_PRODUCT와 FOOD_ORDER 테이블에서 생산일자가 2022년 5월인 식품들의 식품 ID, 식품 이름, 총매출을 조회하는 SQL문을 작성해주세요. 이때 결과는 총매출을 기준으로 내림차순 정렬해주시고 총매출이 같다면 식품 ID를 기준으로 오름차순 정렬해주세요.

SELECT P.PRODUCT_ID, P.PRODUCT_NAME, SUM(P.PRICE*O.AMOUNT) AS TOTAL_PRICE
FROM FOOD_PRODUCT P
INNER JOIN FOOD_ORDER O ON P.PRODUCT_ID = O.PRODUCT_ID
WHERE MONTH(O.PRODUCE_DATE) = "5" 
GROUP BY P.PRODUCT_ID, P.PRODUCT_NAME
ORDER BY TOTAL_PRICE DESC, P.PRODUCT_ID

☑️ 5월 식품들의 총매출 조회하기
입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.

SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_INS I
RIGHT OUTER JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.ANIMAL_ID IS NULL
ORDER BY O.ANIMAL_ID, O.NAME50

☑️있었는데요 없었습니다
보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일이 빠른 순으로 조회해야합니다.

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

* 날짜 관련 주의)) 더 빠르다 = 더 작다 
ㄴ 보호 시작일 보다 입양일이 더 빠른
ㄴ 보호 시작일 > 입양일 
* 빠른 순으로 조회 & 가장 오래 있었다 )) ASC

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

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

☑️보호소에서 중성화한 동물
보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다. 보호소에 들어올 당시에는 중성화1되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성해주세요.
중성화를 거치지 않은 동물은 성별 및 중성화 여부에 Intact, 중성화를 거친 동물은 Spayed 또는 Neutered라고 표시되어있습니다. ↩

<내가 처음 작성한 답안> 오류
SELECT O.ANIMAL_ID, O.ANIMAL_TYPE, O.NAME, O.SEX_UPON_OUTCOME
FROM ANIMAL_INS I 
INNER JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.SEX_UPON_INTAKE LIKE 'Intact%'
AND O.SEX_UPON_OUTCOME LIKE ('Netured%' OR 'Spayed%')
ORDER BY O.ANIMAL_ID DESC

<정답> 
SELECT O.ANIMAL_ID, O.ANIMAL_TYPE, O.NAME
FROM ANIMAL_INS I 
INNER JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.SEX_UPON_INTAKE LIKE 'Intact%'
**AND (O.SEX_UPON_OUTCOME LIKE 'Neutered%' 
OR O.SEX_UPON_OUTCOME LIKE  'Spayed%')**
ORDER BY O.ANIMAL_ID

하지만 이렇게 복잡하게 생각할 것 없이 
SELECT O.ANIMAL_ID, O.ANIMAL_TYPE, O.NAME
FROM ANIMAL_INS I 
INNER JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.SEX_UPON_INTAKE != O.SEX_UPON_OUTCOME  >> 이렇게 상태가 들어올때와 나올 떄의 성별이 다른 동물을 찾는 쿼리 작성
ORDER BY O.ANIMAL_ID

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

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

** 내림차순 desc!!

☑️상품을 구매한 회원 비율 구하기 >>????

SELECT YEAR(DATE(O.SALES_DATE)) AS YEAR, MONTH(DATE(O.SALES_DATE)) AS MONTH,
COUNT(DISTINCT(O.USER_ID)) AS PURCHASED_USERS
#(SUM(O.SALES_AMOUNT) / TOTAL_JOINED)
FROM (
    SELECT COUNT(USER_ID) AS TOTAL_JOINED
    FROM USER_INFO 
    WHERE YEAR(DATE(JOINED))="2021") AS U
    
INNER JOIN ONLINE_SALE AS O
ON U.USER_ID = O.USER_ID
WHERE YEAR(O.SALES_DATE) = "2021"
GROUP BY YEAR, MONTH

☑️그룹별 조건에 맞는 식당 목록 출력하기
MEMBER_PROFILE와 REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요. 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고, 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬해주세요.

<내가 처음 작성한 답>
SELECT M.MEMBER_NAME, MAX_REV.REVIEW_TEXT, DATE_FORMAT(MAX_REV.REVIEW_DATE, "%Y-%m-%d") AS REVIEW_DATE
FROM ( SELECT MEMBER_ID, REVIEW_TEXT,REVIEW_DATE,COUNT(MEMBER_ID) AS REV_CNT
      FROM REST_REVIEW
      GROUP BY MEMBER_ID
      ORDER BY REV_CNT DESC
      LIMIT 1) AS MAX_REV
INNER JOIN MEMBER_PROFILE M ON MAX_REV.MEMBER_ID = M.MEMBER_ID
ORDER BY MAX_REV.REVIEW_DATE, MAX_REV.REVIEW_TEXT

ㄴ 그런데 from 절에 서브쿼리를 작성하는게 잘못되었나봄..

<정답>
SELECT M.MEMBER_NAME, R.REVIEW_TEXT, DATE_FORMAT(R.REVIEW_DATE, "%Y-%m-%d") AS REVIEW_DATE
FROM MEMBER_PROFILE M
INNER JOIN REST_REVIEW R ON M.MEMBER_ID = R.MEMBER_ID
WHERE M.MEMBER_ID = (SELECT MEMBER_ID
                     FROM REST_REVIEW
                     GROUP BY MEMBER_ID
                     ORDER BY COUNT(*) DESC
                     LIMIT 1
                    )
ORDER BY REVIEW_DATE, REVIEW_TEXT;

☑️ 주문량이 많은 아이스크림들 조회하기
7월 아이스크림 총 주문량과 상반기의 아이스크림 총 주문량을 더한 값이 큰 순서대로 상위 3개의 맛을 조회하는 SQL 문을 작성해주세요.

<내가 작성한 답안>
SELECT F.FLAVOR
FROM 
    (SELECT FLAVOR, SUM(TOTAL_ORDER) AS TOTAL_ORDER FROM JULY GROUP BY FLAVOR ) AS A
INNER JOIN FIRST_HALF F ON A.FLAVOR = F.FLAVOR
GROUP BY F.FLAVOR
ORDER BY A.TOTAL_ORDER+F.TOTAL_ORDER DESC
LIMIT 3

ㄴ 여기서 GROUP BY F.FLAVOR는 없어도 된다.
ㄴ 근데 이해가 안갔던 부분 - INNER JOIN을 하면 TOTAL_ORDER끼리 합쳐서 더해지나? (X)ORDER BY에서 조인한 두 테이블의 TOTAL_ORDER을 더했다!ORDER BY에서 연산자를 저렇게 쓸 수 있구나..
profile
안녕하세요 공부한 내용을 기록하기 위해서 시작했습니다.

0개의 댓글