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

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

정답 코드:

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

 

문제 풀이때 했던 생각.

# 아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리
# 이름과 보호 시작일
# 결과는 보호 시작일 순으로 조회

 

다른 풀이

SELECT 
    NAME,
    DATETIME
FROM ANIMAL_INS 
WHERE ANIMAL_ID NOT IN(
    SELECT ANIMAL_ID
    FROM ANIMAL_OUTS )
ORDER BY DATETIME ASC
LIMIT 3
입양을 못갔다 == ANIMAL_OUTS에 기록되지 않았다 이기 때문에
WHERE절 서브쿼리를 사용해 기준컬럼을 만들어 비교하였다.

 

다른 풀이 2

SELECT 
    NAME,
    DATETIME
FROM ANIMAL_INS ai
WHERE NOT EXISTS(
    SELECT 1
    FROM ANIMAL_OUTS ao
    WHERE AI.ANIMAL_ID = ao.ANIMAL_ID)
ORDER BY DATETIME ASC
LIMIT 3
존재 여부를 판단하는 문제이기 때문에 EXISTS를 사용해 판단했다.

 


32. 카테고리 별 도서 판매량 집계하기

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

정답 코드:

SELECT
    b.CATEGORY,
    SUM(bs.SALES) AS TOTAL_SALES
FROM BOOK b
INNER JOIN BOOK_SALES bs
    on b.BOOK_ID = bs.BOOK_ID
WHERE YEAR(bs.SALES_DATE) = 2022 AND MONTH(bs.SALES_DATE) = 1
GROUP BY b.CATEGORY
ORDER BY CATEGORY ASC

문제 풀이때 했던 생각.

# 2022년 1월의 카테고리 별 도서 판매량을 합산
# 카테고리(CATEGORY), 총 판매량(TOTAL_SALES) 리스트를 출력
# 결과는 카테고리명을 기준으로 오름차순 정렬

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

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

정답 코드:

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;

문제 풀이때 했던 생각.

# 상품코드 별 매출액(판매가 * 판매량) 합계를 출력 
# 결과는 매출액을 기준으로 내림차순 정렬, 매출액이 같다면 상품코드를 기준으로 오름차순 정렬

 

34. 있었는데요 없었습니다

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

정답 코드:

SELECT
    ai.ANIMAL_ID,
    ai.NAME
FROM ANIMAL_INS ai
LEFT JOIN ANIMAL_OUTS ao
    on ai.ANIMAL_ID = ao.ANIMAL_ID
where ai.DATETIME > ao.DATETIME
ORDER BY ai.DATETIME ASC

문제 풀이때 했던 생각.

# 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회
# 결과는 보호 시작일이 빠른 순으로 조회

35.오랜 기간 보호한 동물(2)

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

정답 코드:

SELECT 
    ai.ANIMAL_ID,
    ai.NAME
FROM ANIMAL_INS ai
INNER JOIN ANIMAL_OUTS ao
ON ai.ANIMAL_ID = ao.ANIMAL_ID
ORDER BY DATEDIFF(ao.DATETIME , ai.DATETIME) DESC
LIMIT 2

문제 풀이때 했던 생각.

# 입양을 간(INNER JOIN 사용) 동물 중, 보호 기간이 가장 길었던 동물 두 마리
# 아이디와 이름을 조회
# 결과는 보호 기간이 긴 순으로 조회

36. 보호소에서 중성화한 동물

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

정답 코드:

SELECT
    ai.ANIMAL_ID,
    ai.ANIMAL_TYPE,
    ai.NAME
FROM ANIMAL_INS ai
INNER JOIN ANIMAL_OUTS ao
    on ai.ANIMAL_ID = ao.ANIMAL_ID 
WHERE ai.SEX_UPON_INTAKE LIKE 'INTACT%'         # 보호소에 들어올 당시에는 중성화 X
  AND ao.SEX_UPON_OUTCOME NOT LIKE 'INTACT%'    # 보호소를 나갈 당시에는 중성화 O
ORDER BY ai.ANIMAL_ID;

문제 풀이때 했던 생각.

# 보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물
# 동물의 아이디와 생물 종, 이름을 조회
# 아이디 순으로 조회

 

다른 풀이

SELECT 
    ANIMAL_ID, 
    ANIMAL_TYPE, 
    NAME
FROM ANIMAL_OUTS 
WHERE ANIMAL_ID in (
    SELECT ANIMAL_ID
    FROM animal_ins 
    WHERE SEX_UPON_INTAKE LIKE 'INTACT%' ) 
        and (SEX_UPON_OUTCOME NOT LIKE 'INTACT%')
ORDER BY ANIMAL_ID;

 

WHERE 절 서브쿼리로 풀이
보호소에 들어올 당시 중성화 x, 보호소를 나갈때 중성화된 동물의 ID를 출력한뒤 메인쿼리에서 비교

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

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

정답 코드:

SELECT
        b.BOOK_ID,
        a.AUTHOR_NAME,
         DATE_FORMAT(b.PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK b
LEFT JOIN AUTHOR a
    on b.AUTHOR_ID = a.AUTHOR_ID
WHERE CATEGORY = "경제"
ORDER BY PUBLISHED_DATE ASC;

문제 풀이때 했던 생각.

# '경제' 카테고리에 속하는 도서
# 도서 ID(BOOK_ID), 저자명(AUTHOR_NAME), 출판일(PUBLISHED_DATE) 리스트를 출력
# 결과는 출판일을 기준으로 오름차순 정렬

 


38. 조건별로 분류하여 주문상태 출력하기

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

정답 코드:

SELECT
    ORDER_ID,
    PRODUCT_ID,
    DATE_FORMAT(OUT_DATE, "%Y-%m-%d") as OUT_DATE,
    CASE
        WHEN OUT_DATE <= '2022-05-01' THEN '출고완료'
        WHEN OUT_DATE > '2022-05-01' THEN '출고대기'
        ELSE "출고미정"
    END AS '출고여부'
FROM FOOD_ORDER
ORDER BY ORDER_ID ASC

문제 풀이때 했던 생각.

# 2022년 5월 1일을 기준
# 출고여부는 2022년 5월 1일까지 출고완료, 이 후 날짜는 출고 대기로 미정이면 출고미정
# 주문 ID, 제품 ID, 출고일자, 출고여부를 조회
# 결과는 주문 ID를 기준으로 오름차순 정렬

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

 

문제 풀이때 했던 생각.

# 각 아이스크림 성분 타입과 성분 타입에 대한 아이스크림의 총주문량
# 총주문량을 나타내는 컬럼명은 TOTAL_ORDER
# 총주문량이 작은 순서대로 조회(오름차순)
# 필요한것 아이스크림 성분 타입, 성분 타입에 대한 아이스크림의 총주문량

 


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인 동물
#  동물의 아이디와 이름, 성별 및 중성화 여부를 조회

 


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 YEAR(PUBLISHED_DATE) = 2021
        AND CATEGORY = '인문'
ORDER BY PUBLISHED_DATE ASC

문제 풀이때 했던 생각.

# 2021년에 출판된 '인문' 카테고리에 속하는 도서 리스트
# 도서 ID(BOOK_ID), 출판일 (PUBLISHED_DATE)을 출력
# 결과는 출판일을 기준으로 오름차순 정렬

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'인 자동차, 
# 평균 일일 대여 요금을 출력
# 이때 평균 일일 대여 요금은 소수 첫 번째 자리에서 반올림
# 컬럼명은 AVERAGE_FEE 로 지정

43. 조건에 맞는 사용자와 총 거래금액 조회하기

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

정답 코드:

SELECT
    U.USER_ID,
    NICKNAME,
    SUM(B.PRICE) AS TOTAL_SALES
FROM USED_GOODS_BOARD B
INNER JOIN USED_GOODS_USER U
ON B.WRITER_ID = U.USER_ID
WHERE B.STATUS = 'DONE'
GROUP BY U.USER_ID
HAVING SUM(B.PRICE) >= 700000
ORDER BY TOTAL_SALES ASC

 

문제 풀이때 했던 생각.

# 완료된 중고 거래의 총금액이 70만 원 이상인 사람
# 회원 ID, 닉네임, 총거래금액을 조회
# 결과는 총거래금액을 기준으로 오름차순 정렬

 

다른 풀이

WITH TOTAL_PRICE AS (
    SELECT
        WRITER_ID,
        SUM(PRICE) AS TOTAL_SALES
    FROM USED_GOODS_BOARD
    WHERE STATUS = 'DONE'
    GROUP BY WRITER_ID
    HAVING SUM(PRICE) >= 700000
)
SELECT
    u.USER_ID,
    u.NICKNAME,
    t.TOTAL_SALES
FROM USED_GOODS_USER u
INNER JOIN TOTAL_PRICE AS t
    ON u.USER_ID = t.WRITER_ID
ORDER BY t.TOTAL_SALES ASC;
FROM 절 서브쿼리를 사용해 문제풀이
가독성을 위해 CTE 사용
쓰고 보니 굳이 쓸 필요성을 못느낌

 

 

 


44. 가격대 별 상품 개수 구하기

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

정답 코드:

SELECT
    FLOOR(PRICE / 10000) * 10000 AS PRICE_GROUP,
    COUNT(*) AS PRODUCTS
FROM PRODUCT 
GROUP BY FLOOR(PRICE / 10000) * 10000
ORDER BY PRICE_GROUP;

 

문제 풀이때 했던 생각.

# 만원 단위의 가격대 별로 상품 개수를 출력하는 SQL 문
# 가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시
# 결과는 가격대를 기준으로 오름차순 정렬


# 가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시

GROUP BY FLOOR(PRICE / 10000) * 10000
이 부분은 위에서 만든 PRICE_GROUP 값으로 행을 묶는 역할을 한다

내부에선 다음과 같은 형태로 만들어진다.
10000~19999인 그룹
20000~29999인 그룹
30000~39999인 그룹

 


45.3월에 태어난 여성 회원 목록 출력하기

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

정답 코드:

SELECT
    MEMBER_ID,
    MEMBER_NAME,
    GENDER,
    DATE_FORMAT(DATE_OF_BIRTH,'%Y-%m-%d') AS DATE_OF_BIRTH
FROM MEMBER_PROFILE 
WHERE TLNO IS NOT NULL
    AND MONTH(DATE_OF_BIRTH) = 3
    AND GENDER = 'W'
ORDER BY MEMBER_ID ASC

 

문제 풀이때 했던 생각.

# 생일이 3월인 여성 회원의 ID, 이름, 성별, 생년월일을 조회
# 이때 전화번호가 NULL인 경우는 출력대상에서 제외
# 결과는 회원ID를 기준으로 오름차순 정렬

 


46. 대여 기록이 존재하는 자동차 리스트 구하기

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

정답 코드:

SELECT DISTINCT(CC.CAR_ID)
FROM CAR_RENTAL_COMPANY_CAR CC
INNER JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY CH
ON CC.CAR_ID = CH.CAR_ID
WHERE CC.CAR_TYPE = '세단' 
    AND MONTH(CH.START_DATE) = 10 
ORDER BY CC.CAR_ID DESC;

문제 풀이때 했던 생각.

# 자동차 종류가 '세단'인 자동차 중 10월에 대여를 시작한 기록이 있는 자동차
# ID 리스트를 출력  자동차 ID 리스트는 중복이 없어야 함
# 자동차 ID를 기준으로 내림차순 정렬

 


 

48. 즐겨찾기가 가장 많은 식당 정보 출력하기

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

정답 코드:

SELECT
    r.FOOD_TYPE,
    r.REST_ID,
    r.REST_NAME,
    r.FAVORITES
FROM REST_INFO r
INNER JOIN (
        SELECT FOOD_TYPE, MAX(FAVORITES) AS MAXFAVORITES
        FROM REST_INFO
        GROUP BY FOOD_TYPE) AS f
    ON r.FOOD_TYPE = f.FOOD_TYPE
    AND r.FAVORITES = f.MAXFAVORITES
ORDER BY FOOD_TYPE DESC

 

문제 풀이때 했던 생각.

# 음식종류별로 즐겨찾기수가 가장 많은 식당
# 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회
# 결과는 음식 종류를 기준으로 내림차순 정렬

 

다른 풀이

SELECT
    FOOD_TYPE,
    REST_ID,
    REST_NAME,
    FAVORITES
FROM (
    SELECT
        FOOD_TYPE,
        REST_ID,
        REST_NAME,
        FAVORITES,
        ROW_NUMBER() OVER (
            PARTITION BY FOOD_TYPE
            ORDER BY FAVORITES DESC
        ) AS rn
    FROM REST_INFO
) t
WHERE rn = 1
ORDER BY FOOD_TYPE DESC;
랭크 함수를 사용해서 풀이

 


49. 식품분류별 가장 비싼 식품의 정보 조회하기

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

정답 코드:

SELECT
    f.CATEGORY,
    f.PRICE AS MAX_PRICE,
    f.PRODUCT_NAME
FROM FOOD_PRODUCT f
INNER JOIN (
    SELECT CATEGORY,
            MAX(PRICE) AS MAX_PRICE
    FROM FOOD_PRODUCT
    GROUP BY CATEGORY) AS mp
ON f.CATEGORY = mp.CATEGORY
    AND f.PRICE = mp.MAX_PRICE
WHERE f.CATEGORY IN ('과자', '국', '김치', '식용유')
ORDER BY PRICE DESC

 

문제 풀이때 했던 생각.

# 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회
# 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력
# 식품 가격을 기준으로 내림차순 정렬

 

다른 풀이

SELECT
    CATEGORY,
    PRICE AS MAX_PRICE,
    PRODUCT_NAME
FROM (
    SELECT
        CATEGORY,
        PRICE,
        PRODUCT_NAME,
        ROW_NUMBER() OVER (
            PARTITION BY CATEGORY
            ORDER BY PRICE DESC
        ) AS rn
    FROM FOOD_PRODUCT
    WHERE CATEGORY IN ('과자', '국', '김치', '식용유')
) t
WHERE rn = 1
ORDER BY PRICE DESC;
랭크 함수를 사용해서 풀이

 


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

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

정답 코드:

SELECT
    fp.PRODUCT_ID,
    fp.PRODUCT_NAME,
    SUM(fp.PRICE * fo.AMOUNT) AS TOTAL_SALES
FROM FOOD_PRODUCT  fp
INNER JOIN FOOD_ORDER fo
    ON fp.PRODUCT_ID = fo.PRODUCT_ID
WHERE fo.PRODUCE_DATE >= '2022-05-01'
  AND fo.PRODUCE_DATE <  '2022-06-01'
GROUP BY fp.PRODUCT_ID, fp.PRODUCT_NAME
ORDER BY TOTAL_SALES DESC, fp.PRODUCT_ID ASC

문제 풀이때 했던 생각.

# 테이블에서 생산일자가 2022년 5월인 식품들
# 식품 ID, 식품 이름, 총매출을 조회
#  총매출을 기준으로 내림차순 정렬 식품 ID를 기준으로 오름차순

 

+ Recent posts