티스토리 뷰
문제 순서
- 조건에 맞는 사용자와 총 거래금액 조회하기 (Level 3)
- 저자 별 카테고리 별 매출액 집계하기 (Level 4)
- 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기 (Level 2)
- 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (Level 3)
- 성분으로 구분한 아이스크림 총 주문량 (Level 2)
- 즐겨찾기가 가장 많은 식당 정보 출력하기 (Level 3)
- 카테고리 별 도서 판매량 집계하기 (Level 3)
- 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 (Level 3)
- 진료과별 총 예약 횟수 출력하기 (Level 2)
- 식품분류별 가장 비싼 식품의 정보 조회하기 (Level 4)
- 고양이와 개는 몇 마리 있을까 (Level 2)
- 동명 동물 수 찾기 (Level 2)
- 년, 월, 성별 별 상품 구매 회원 수 구하기 (Level 4)
- 입양 시각 구하기(1) (Level 2)
- 입양 시각 구하기(2) (Level 4)
✅ 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
'코딩 테스트 > SQL' 카테고리의 다른 글
[프로그래머스] SQL 고득점 Kit SUM, MAX, MIN 정답 모음 (0) | 2024.03.25 |
---|---|
[프로그래머스] SQL 고득점 Kit SELECT문 정답 모음 (0) | 2024.03.24 |