코딩 테스트/SQL 77

이빠진 데이터를 채워넣어보자 (재귀 테이블, 윈도우 함수)

문제는 - 월별(년-월) 주문 건수를 계산하되, 주문이 없는 달도 0건으로 포함하고- 지난달 대비 주문 건수 증감율도 계산해야 하는 문제다 우선 주문 시간을 월별로 GROUP BY 한 뒤 주문건수를 구해보자. 16년 10월, 11월 데이터가 빠져있는 것을 확인할 수 있다.빠진 월을 포함할 수 있도록 재귀 테이블을 만들어준다. 먼저 재귀테이블의 구조를 알아보자 이 구조에서 날짜값을 하나씩 더해갈 건데 초기값 2016-10 부터 한달씩 더해야 한다.이때 DATE_ADD 함수가 쓰이는데 이 함수에 대해서도 알아 둘 필요가 있다. 이제 테이블을 만들어보자. DATE_ADD의 데이터로는 완전한 날짜 형식 (예: '2022-10-01') 이 들어가야 한다 테이블이 만들어졌으니 먼저 확인한 테이블과 현재 테이블 기준..

상품을 구매한 회원 비율 구하기

[문제] USER_INFO 테이블과 ONLINE_SALE 테이블에서 2021년에 가입한 전체 회원들 중 상품을 구매한 회원수와 상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을 년, 월 별로 출력하는 SQL문을 작성해주세요. 상품을 구매한 회원의 비율은 소수점 두번째자리에서 반올림하고, 전체 결과는 년을 기준으로 오름차순 정렬해주시고 년이 같다면 월을 기준으로 오름차순 정렬해주세요. [단계별 풀이] 1. 두 테이블을 USER_ID로 JOIN 해준다. (SUB쿼리로 USER_ID를 필터링할 수도 있지만 성능상 좋지 않다)2. 필터링은 LIKE 연산자로 해주는 것이 YEAR(JOINED) = 2021 보다 더 효율적이다. (문자열 단순 비..

자동차 대여 기록 별 대여 금액 구하기

[문제] CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '트럭'인 자동차의 대여 기록에 대해서 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬해주세요. [단계별 풀이] 1. HISTORY 테이블과 CAR 테이블을 CAR_ID로 JOIN 하되 CAR_TYPE이 트럭인 행들만 필터링해서 JOIN 한다2. DATE_DIFF를 사용하여 대여 기간을 구하고 기간별 할인율을..

특정 기간동안 대여 가능한 자동차들의 대여비용 구하기

[문제] CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '세단' 또는 'SUV' 인 자동차 중 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하고 30일간의 대여 금액이 50만원 이상 200만원 미만인 자동차에 대해서 자동차 ID, 자동차 종류, 대여 금액(컬럼명: FEE) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 자동차 종류를 기준으로 오름차순 정렬, 자동차 종류까지 같은 경우 자동차 ID를 기준으로 내림차순 정렬해주세요. CAR_RENTAL_COMPANY_..

입양 시각 구하기2

[문제] 보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다. [단계별 풀이] 해당 문제는 이빠진 데이터를 채워야하는 문제로 재귀저문제]보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.  [단계별 풀이]해당 문제는 이빠진 데이터를 채워야하는 문제로 재귀테이블을 사용해야한다구조를 알아보자WITH RECURSIVE 테이블명 (컬럼명) AS ( SELECT 초기값 UNION AL..

조건에 부합하는 중고거래 댓글 조회하기

[문제] USED_GOODS_BOARD와 USED_GOODS_REPLY 테이블에서 2022년 10월에 작성된 게시글 제목, 게시글 ID, 댓글 ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일을 조회하는 SQL문을 작성해주세요. 결과는 댓글 작성일을 기준으로 오름차순 정렬해주시고, 댓글 작성일이 같다면 게시글 제목을 기준으로 오름차순 정렬해주세요. [단계별 풀이] 1. 두 테이블을 BOARD_ID로 JOIN2. 게시글 작성일자가 2022년 10월인 행들만 필터링3. 제목, 게시글 ID, 댓글 ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일을 조회4. 댓글 작성일, 제목을 오름차순 정렬 [정답]SELECT B.TITLE, B.BOARD_ID, R.REPLY_ID, ..

오프라인/온라인 판매 데이터 통합하기

[문제] ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성해주세요. OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시해주세요. 결과는 판매일을 기준으로 오름차순 정렬해주시고 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해주세요. [단계별 풀이] 1. 두 테이블을 판매날짜 기준으로 합하되 FULL OUTER JOIN을 하자2. LEFT JOIN과 RIGHT JOIN을 UNION 해주자3. 이때 OFF 테이블의 USER_ID는 NULL 처리 해준다4. 판매 날짜, 상품ID, 유저ID,..

강원도에 위치한 생산공장 목록 출력하기

[문제] FOOD_FACTORY 테이블에서 강원도에 위치한 식품공장의 공장 ID, 공장 이름, 주소를 조회하는 SQL문을 작성해주세요. 이때 결과는 공장 ID를 기준으로 오름차순 정렬해주세요.[단계별 풀이] 1. ADDRESS가 강원인 행을 필터링 (LIKE연산자)2. ID, NAME, ADDRESS 출력3. ID로 오름차순 정렬[정답]SELECT FACTORY_ID, FACTORY_NAME, ADDRESSFROM FOOD_FACTORYWHERE ADDRESS LIKE '강원%'ORDER BY FACTORY_ID

그룹별 조건에 맞는 식당 목록 출력하기

[문제] MEMBER_PROFILE와 REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요. 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고, 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬해주세요. [단계별 풀이] 1. 우선 리뷰 MEMBER_ID 로 GROUP BY 해서 REVIEW 의 갯수를 구한다. 정렬하고 1행만 남겨둔다2. 해당 쿼리를 서브쿼리로 보내고3. 멤버테이블과 리뷰테이블을 MEMBER_ID로 JOIN4. 이름과 리뷰텍스트, 작성일을 조회한다5. 아까 보낸 서브쿼리서 MEMBER_ID를 가져와 같은 것들만 필터링6. 정렬[정답]SELECT M.MEMBER_NAME..

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

[문제] CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요. [단계별 풀이] 1. 우선 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회인 자동차들을 필터링 하기 위해 서브쿼리 작성2. 해당 서브쿼리에 속하면서 다시 START_DATE가 8~10월 사이인 CAR_ID만 필터링3. M..