[SQL] 프로그래머스 LV.2 70%대 정답률 문제

Stella·2023년 8월 22일

1. 재구매가 일어난 상품과 회원리스트 구하기

SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*)>1
ORDER BY USER_ID, PRODUCT_ID DESC;
  • 문제
    ONLINE_SALE 테이블에서 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여, 재구매한 회원 ID와 재구매한 상품 ID를 출력하는 SQL문을 작성해주세요. 결과는 회원 ID를 기준으로 오름차순 정렬해주시고 회원 ID가 같다면 상품 ID를 기준으로 내림차순 정렬해주세요.

  • 풀이
    회원 ID와 상품ID를 묶어 그룹화, 그룹한 정보수가 1회 초과(2회 이상) 있는 것을 조건으로 한다. 우선 그룹화를 하여 컬럼의 UNIQUE한 값에 따라 그룹화하고, 중복된 열을 제거한다.

GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) > 1을 하여 구매 횟수가 1회 이상인 값만 출력하도록 한다.

2. 조건에 부합하는 중고거래 상태 조회하기

SELECT BOARD_ID, WRITER_ID, TITLE, PRICE, CASE WHEN STATUS = 'SALE' THEN '판매중'
                                               WHEN STATUS = 'RESERVED' THEN '예약중'
                                               WHEN STATUS = 'DONE' THEN '거래완료' END AS STATUS
FROM USED_GOODS_BOARD
WHERE CREATED_DATE LIKE '2022-10-05'
ORDER BY BOARD_ID DESC;
  • 문제
    USED_GOODS_BOARD 테이블에서 2022년 10월 5일에 등록된 중고거래 게시물의 게시글 ID, 작성자 ID, 게시글 제목, 가격, 거래상태를 조회하는 SQL문을 작성해주세요. 거래상태가 SALE 이면 판매중, RESERVED이면 예약중, DONE이면 거래완료 분류하여 출력해주시고, 결과는 게시글 ID를 기준으로 내림차순 정렬해주세요.

CASE문이 쓸 때마다 CASE WHEN THEN까지는 기억나는데
WHEN에서 컬럼을 중복으로 선언해줘야 하는것을 까먹는 것 같다.
WHERE절 사용법이랑 비슷하게 사용하면 될 것 같다.

3. 자동차 평균 대여 기간 구하기

SELECT CAR_ID, ROUND(AVG(DATEDIFF(END_DATE, START_DATE)+1),1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY                                   
GROUP BY CAR_ID
HAVING AVERAGE_DURATION >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC;

ROUND, AVG, DATEDIFF 등 중첩되도록 함수를 사용해야해서 어렵게 느껴진것 같다.
DATEDIFF값에 +1을 주는 이유는 동일한 날짜는 0으로 값이 나오기 때문에 +1부터 시작한다.

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 평균 대여 기간이 7일 이상인 자동차들의 자동차 ID와 평균 대여 기간(컬럼명: AVERAGE_DURATION) 리스트를 출력하는 SQL문을 작성해주세요. 평균 대여 기간은 소수점 두번째 자리에서 반올림하고, 결과는 평균 대여 기간을 기준으로 내림차순 정렬해주시고, 평균 대여 기간이 같으면 자동차 ID를 기준으로 내림차순 정렬해주세요.

profile
공부 기록

0개의 댓글