39.  성분으로 구분한 아이스크림 총 주문량

문제 링크:https://school.programmers.co.kr/learn/courses/30/lessons/133026

정답 코드:

SELECT
    ii.INGREDIENT_TYPE,
    SUM(fh.TOTAL_ORDER) AS TOTAL_ORDER
FROM ICECREAM_INFO ii
INNER JOIN FIRST_HALF fh
    on ii.FLAVOR = fh.FLAVOR
GROUP BY ii.INGREDIENT_TYPE
ORDER BY TOTAL_ORDER ASC

 

문제 풀이때 했던 생각.

문제에서 원하는 것은 아이스크림 성분 타입과 그에 대한 총주문량
때문에 FIRST_HALF 과 ICECREAM_INFO 테이블을 조인
기준 테이블은 ICECREAM_INFO 테이블, 각 아이스크림 성분 타입의 총 주문량을 구해야 하기 때문에 LEFT JOIN 사용
그룹은 ii.INGREDIENT_TYPE로 묶음(성분 타입별 총주문량을 원했기 때문에)
총주문량이 작은 순서대로 보이길 원했기 때문에 ORDER BY TOTAL_ORDER ASC 사용


무엇이 잘못되었나?

JOIN 종류 선택 관점 (논리적 의심 지점)
[각 아이스크림 성분 타입의 총 주문량을 구해야 하기 때문에 LEFT JOIN 사용]

문제에선 “상반기 총 주문량”을 요구함, FIRST_HALF 테이블은 상반기 주문 데이터만 존재

매출을 계산한다는 건 → 주문이 존재한 맛(flavor) 만 대상이 되는 게 자연스러움

이때 LEFT JOIN을 쓰면...
→ 상반기에 한 번도 팔리지 않은 아이스크림도 INGREDIENT_TYPE 집계에 포함될 수 있음
→ 이 경우 SUM(fh.TOTAL_ORDER)는 NULL이거나 0에 가까운 값이 됨

문제 조건(상반기 총 주문량) 관점에서 LEFT JOIN이 “의도에 맞는가?”는 다시 고민해볼 필요가 있음


해결법

문제에서 원하는 것은 “상반기 총 주문량”
즉, 주문된 아이스크림의 총 주문량을 구해야함.
->
모든 아이스크림을 출력하는것이 아닌 '주문된' 아이스크림만 보는게 더 옳바름

때문에 INNER JOIN 사용


+
문제에선 총 주문량을 보여달라 했지, 팔리지 않은 아이스크림은 빼달라 하지 않았음, LEFT JOIN도 정답이긴 하나...
허나 이 문제는 상반기 총주문량 비교가 목적이기 때문에 주문 데이터가 존재하는 아이스크림만 집계해야 하고,
따라서 INNER JOIN이 문제 의도에 더 부합하다 판단.

 


40. 루시와 엘라 찾기

문제 링크:https://school.programmers.co.kr/learn/courses/30/lessons/59046

정답 코드:

SELECT
    ANIMAL_ID,
    NAME,
    SEX_UPON_INTAKE
FROM ANIMAL_INS 
WHERE NAME in ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
ORDER BY ANIMAL_ID ASC

문제 풀이때 했던 생각.

동물 보호소에 들어온 동물 중 이름이 Lucy, Ella, Pickle, Rogan, Sabrina, Mitty인 동물들을 원했기 때문에
WHERE 절을 사용해 이름이  Lucy, Ella, Pickle, Rogan, Sabrina, Mitty인 동물로 필터링

in을 사용하긴 했으나 or 을 사용해 문제를 풀수도 있음

 


41. 조건에 맞는 도서 리스트 출력하기

문제 링크:https://school.programmers.co.kr/learn/courses/30/lessons/144853

정답 코드:

SELECT
    BOOK_ID,
    DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM book
WHERE PUBLISHED_DATE LIKE '2021%'
        AND CATEGORY = '인문'
ORDER BY PUBLISHED_DATE ASC

문제 풀이때 했던 생각.

2021년에 출판된 '인문' 카테고리에 속하는 도서 리스트를 원했기 때문에
WHERE 절로  출판일이 2021년이면서 카테고리가 '인문'인 도서 필터링  

42. 평균 일일 대여 요금 구하기

문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/151136

정답 코드:

SELECT 
    ROUND(AVG(DAILY_FEE), 0) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR 
WHERE CAR_TYPE = 'SUV'

문제 풀이때 했던 생각.

SUV 타입의 평균 일일 대여 요금을 원하기 때문에 WHERE 절로 'SUV'만 따로 추출
이후 AVG를 사용해 평균값을 구한뒤 ROUND를 사용해 소수점 첫번째 자리 반올림

 

 

+ Recent posts