[MySQL] 프로그래머스 문제 연습 14

Lake·2024년 5월 7일
0

SQL 문제

목록 보기
17/36
post-thumbnail

조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기 (STRING, DATE)

  • USED_GOODS_BOARDUSED_GOODS_FILE 테이블에서 조회수가 가장 높은 중고거래 게시물에 대한 첨부파일 경로를 조회하는 SQL문을 작성해주세요. 첨부파일 경로는 FILE ID를 기준으로 내림차순 정렬해주세요. 기본적인 파일경로는 /home/grep/src/ 이며, 게시글 ID를 기준으로 디렉토리가 구분되고, 파일이름은 파일 ID, 파일 이름, 파일 확장자로 구성되도록 출력해주세요. 조회수가 가장 높은 게시물은 하나만 존재합니다.

제출한 쿼리 :

SELECT CONCAT('/home/grep/src/', BOARD_ID, '/', FILE_ID, FILE_NAME, FILE_EXT) AS "FILE_PATH"
FROM USED_GOODS_FILE
WHERE BOARD_ID = (
                  SELECT BOARD_ID
                  FROM USED_GOODS_BOARD
                  ORDER BY VIEWS DESC 
                  LIMIT 1
                 )
ORDER BY FILE_ID DESC;

주문량이 많은 아이스크림들 조회하기 (JOIN)

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

제출한 쿼리 :

WITH A AS (
    SELECT *
    FROM JULY
    
    UNION ALL
    
    SELECT *
    FROM FIRST_HALF 
    )

SELECT FLAVOR 
FROM A 
GROUP BY FLAVOR 
ORDER BY SUM(TOTAL_ORDER) DESC 
LIMIT 3;

풀이 방법은 알겠는데 막상 정답이 안 나와서 너무 헤맸다... JOIN으로 풀다가 결국에는 UNION으로 풂


저자 별 카테고리 별 매출액 집계하기 (GROUP BY)

  • 2022년 1월의 도서 판매 데이터를 기준으로 저자 별, 카테고리 별 매출액(TOTAL_SALES = 판매량 * 판매가) 을 구하여, 저자 ID(AUTHOR_ID), 저자명(AUTHOR_NAME), 카테고리(CATEGORY), 매출액(SALES) 리스트를 출력하는 SQL문을 작성해주세요.
    결과는 저자 ID를 오름차순으로, 저자 ID가 같다면 카테고리를 내림차순 정렬해주세요.

제출한 쿼리 :

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

이제 이런 유형의 문제는 잘 푸는 듯(서브쿼리만 안 써도 된다면...) 그냥 문제 조건에 맞춰서 필터링/조건 걸어줄 것 걸어주고 쭉 써내려가면 끝이니까. 근데 서브쿼리... 사실 서브쿼리 언제, 왜, 어떻게 써야 하는 이유도 모르겠음. 그냥 한번 필터링한 결과를 다시 조건에 맞춰서 필터링 해야 해서 쓰는건가? 아님 단순히 WHERE절, HAVING절로는 부족해서? 아님 그냥 조건이 여러개니까? 하라면 할 수는 있겠는데......... 뭔가 깔끔하게 해결되지 않는 기분이다ㅋㅋㅋ


대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (GROUP BY)

  • CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요.

제출한 쿼리 :

WITH A AS (
    SELECT CAR_ID, COUNT(CAR_ID) AS rental_count
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE MONTH(START_DATE) BETWEEN 8 AND 10
    GROUP BY CAR_ID
    HAVING COUNT(CAR_ID) >= 5
)

SELECT MONTH(START_DATE) AS "rental_month"
       , CAR_ID
       , COUNT(CAR_ID) AS "records"
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE (MONTH(START_DATE) BETWEEN 8 AND 10)
      AND (CAR_ID IN (SELECT A.CAR_ID FROM A))
GROUP BY CAR_ID, MONTH(START_DATE)
HAVING COUNT(CAR_ID) != 0 
ORDER BY rental_month ASC, CAR_ID DESC;

어찌저찌 풀긴 풀었는데... 역시나 서브쿼리/WITH 구문 써야하는 이유를 완전히 납득하지는 못 하겠어서 지피티 선생님한테 물어봄.


아... 좀 납득이 간다 이제(과연...ㅋ 하루 지나면 또 납득 못 할듯)

그룹별 조건에 맞는 식당 출력하기 (JOIN)

  • MEMBER_PROFILEREST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요. 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고, 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬해주세요.

제출한 쿼리 :

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

오늘의 TMI

오늘 새벽 최강야구 보고 심장 떨려서 잠 못잠;;;;;; 직관 피켓팅 도전간다,,,
야구 재밌는 거였구나?

0개의 댓글