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회 이상인 값만 출력하도록 한다.
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;
CASE문이 쓸 때마다 CASE WHEN THEN까지는 기억나는데
WHEN에서 컬럼을 중복으로 선언해줘야 하는것을 까먹는 것 같다.
WHERE절 사용법이랑 비슷하게 사용하면 될 것 같다.
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를 기준으로 내림차순 정렬해주세요.