티스토리 뷰

문제 순서

  1. 조건에 맞는 사용자와 총 거래금액 조회하기 (Level 3)
  2. 저자 별 카테고리 별 매출액 집계하기 (Level 4)
  3. 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기 (Level 2)
  4. 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (Level 3)
  5. 성분으로 구분한 아이스크림 총 주문량 (Level 2)
  6. 즐겨찾기가 가장 많은 식당 정보 출력하기 (Level 3)
  7. 카테고리 별 도서 판매량 집계하기 (Level 3)
  8. 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 (Level 3)
  9. 진료과별 총 예약 횟수 출력하기 (Level 2)
  10. 식품분류별 가장 비싼 식품의 정보 조회하기 (Level 4)
  11. 고양이와 개는 몇 마리 있을까 (Level 2)
  12. 동명 동물 수 찾기 (Level 2)
  13. 년, 월, 성별 별 상품 구매 회원 수 구하기 (Level 4)
  14. 입양 시각 구하기(1) (Level 2)
  15. 입양 시각 구하기(2) (Level 4)

15 / 24

 

✅ 24문제 중 10 15문제에 대한 답만 작성했습니다. 점차 추가해 나가겠습니다 :)

 

https://school.programmers.co.kr/learn/courses/30/parts/17044

 

프로그래머스

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

programmers.co.kr


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

SELECT U.USER_ID, U.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 B.WRITER_ID
HAVING SUM(B.PRICE) >= 700000
ORDER BY SUM(B.PRICE);

 

 

2. 저자 별 카테고리 별 매출액 집계하기

  • 가상 테이블 사용
SELECT A.AUTHOR_ID, A.AUTHOR_NAME, V.CATEGORY, SUM(V.TOTAL_SALES) AS TOTAL_SALES
FROM AUTHOR A
    INNER JOIN (
        SELECT B.BOOK_ID, B.AUTHOR_ID, B.CATEGORY, SUM(S.SALES * B.PRICE) AS TOTAL_SALES
        FROM BOOK B INNER JOIN BOOK_SALES S ON B.BOOK_ID = S.BOOK_ID
        WHERE YEAR(S.SALES_DATE) = 2022 AND MONTH(S.SALES_DATE) = 1
        GROUP BY B.BOOK_ID
    ) V
    ON A.AUTHOR_ID = V.AUTHOR_ID
GROUP BY A.AUTHOR_ID, V.CATEGORY
ORDER BY A.AUTHOR_ID, V.CATEGORY DESC;

 

더 간단하게 만들 수도 있다.

SELECT A.AUTHOR_ID, A.AUTHOR_NAME, B.CATEGORY, SUM(S.SALES * B.PRICE) AS TOTAL_SALES
FROM BOOK B
    INNER JOIN AUTHOR A ON B.AUTHOR_ID = A.AUTHOR_ID
    INNER JOIN BOOK_SALES S ON B.BOOK_ID = S.BOOK_ID
WHERE S.SALES_DATE LIKE "2022-01%"
GROUP BY A.AUTHOR_ID, B.CATEGORY
ORDER BY A.AUTHOR_ID, B.CATEGORY DESC;

 

 

3. 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기

SELECT CAR_TYPE, COUNT(*) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE
    OPTIONS LIKE "%통풍시트%"
    OR OPTIONS LIKE "%열선시트%"
    OR OPTIONS LIKE "%가죽시트%"
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE;

 

 

4. 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기

SELECT MONTH(START_DATE) AS MONTH, CAR_ID, COUNT(*) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE CAR_ID IN (
    SELECT CAR_ID
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE YEAR(START_DATE) = 2022 AND MONTH(START_DATE) IN (8, 9, 10)
    GROUP BY CAR_ID
    HAVING COUNT(HISTORY_ID) >= 5
    )
    AND YEAR(START_DATE) = 2022 AND MONTH(START_DATE) IN (8, 9, 10)
GROUP BY MONTH, CAR_ID
HAVING RECORDS > 0
ORDER BY MONTH, CAR_ID DESC;

 

 

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

SELECT I.INGREDIENT_TYPE, SUM(F.TOTAL_ORDER) AS TOTAL_ORDER
FROM FIRST_HALF F
    INNER JOIN ICECREAM_INFO I
    ON F.FLAVOR = I.FLAVOR
GROUP BY I.INGREDIENT_TYPE
ORDER BY TOTAL_ORDER;

 

 

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

SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO A
WHERE FAVORITES = (
    SELECT MAX(B.FAVORITES)
    FROM REST_INFO B
    WHERE B.FOOD_TYPE = A.FOOD_TYPE
)
ORDER BY FOOD_TYPE DESC;

 

 

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

SELECT B.CATEGORY, SUM(S.SALES) AS TOTAL_SALES
FROM BOOK B
    INNER JOIN BOOK_SALES S
    ON B.BOOK_ID = S.BOOK_ID
WHERE S.SALES_DATE LIKE "2022-01%"
GROUP BY B.CATEGORY
ORDER BY B.CATEGORY;

 

 

8. 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기

  • IF( 조건, 참일 때, 거짓일 때)
SELECT CAR_ID, IF (
    SUM(IF(START_DATE <= "2022-10-16" AND END_DATE >= "2022-10-16", 1, 0)),
    "대여중",
    "대여 가능"
) AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;

 

 

9. 진료과별 총 예약 횟수 출력하기

SELECT MCDP_CD AS 진료과코드, COUNT(*) AS 5월예약건수
FROM APPOINTMENT
WHERE MONTH(APNT_YMD) = 5
GROUP BY MCDP_CD
ORDER BY 5월예약건수, MCDP_CD;

 

 

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

  • Group by로 각 카테고리별 가장 비싼 가격을 구한 후, (카테고리, 가격)와 일치한 식품 이름을 출력한다.
SELECT A.CATEGORY, A.PRICE AS MAX_PRICE, A.PRODUCT_NAME
FROM FOOD_PRODUCT A
WHERE (A.CATEGORY, A.PRICE) IN (
    SELECT CATEGORY, MAX(PRICE)
    FROM FOOD_PRODUCT
    WHERE CATEGORY IN ("과자", "국", "김치", "식용유")
    GROUP BY CATEGORY
)
ORDER BY A.PRICE DESC;

 

 

11. 고양이와 개는 몇 마리 있을까

SELECT ANIMAL_TYPE, COUNT(*) AS count
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE;

 

 

12. 동명 동물 수 찾기

SELECT NAME, COUNT(NAME) AS COUNT
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING COUNT(*) >= 2
ORDER BY NAME;

 

 

13. 년, 월, 성별 별 상품 구매 회원 수 구하기

n월에 여러 번 구매한 회원이 있을 수 있다. 그러나 월별 회원 수를 구해야 한다. 따라서 한 달에 여러 번 구매한 회원을 한 명으로 처리해야 하므로, DISTINCT가 필요하다.

SELECT YEAR(S.SALES_DATE) AS YEAR, MONTH(S.SALES_DATE) AS MONTH, U.GENDER, COUNT(DISTINCT U.USER_ID) AS USERS
FROM USER_INFO U
    INNER JOIN ONLINE_SALE S
    ON U.USER_ID = S.USER_ID
WHERE U.GENDER IS NOT NULL
GROUP BY YEAR, MONTH, U.GENDER
ORDER BY YEAR, MONTH, U.GENDER;

 

 

14. 입양 시각 구하기(1)

SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) BETWEEN 9 AND 20
GROUP BY HOUR(DATETIME)
ORDER BY HOUR;

 

 

15. 입양 시각 구하기(2)

  • WITH RECURSIVE로 0부터 23까지의 값을 가지는 가상 테이블 생성
  • ANIMAL_OUTS와 위 가상 테이블을 조인하되, 가상 테이블 쪽으로 LEFT JOIN이나 RIGHT JOIN
  • 그러면 예를 들어 0시에 입양 기록이 없더라도, HOUR가 0인 레코드가 존재한다. 
WITH RECURSIVE HOURS AS
(
    SELECT 0 AS HOUR
    UNION ALL
    SELECT HOUR + 1
    FROM HOURS
    WHERE HOUR < 23
)

SELECT B.HOUR, (SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = B.HOUR) AS COUNT
FROM ANIMAL_OUTS A
    RIGHT JOIN HOURS B
    ON HOUR(A.DATETIME) = B.HOUR
GROUP BY B.HOUR;
728x90