본문 바로가기

Algorithm

(48)
[프로그래머스] Oracle - (SQL 고득점 Kit) JOIN 주문량이 많은 아이스크림들 조회하기 문제 1) 7월 아이스크림 총 주문량과 상반기의 아이스크림 2) 총 주문량을 더한 값이 큰 순서대로 상위 3개의 맛을 조회하는 SQL 문을 작성해주세요. 문제 풀이 테이블의 컬럼 수와 데이터 형식이 모두 일치하고, SHIPMENT_ID는 동일하지 않은 상태이기 때문에 두 테이블을 합치기 위하여 UNION ALL 연산을 사용한다. 상위 3개의 맛을 조회하기 위하여 GROUP BY로 묶어준 뒤, 총 주문량을 sum 함수로 구하여 정렬한다. 전체 코드 SELECT FLAVOR FROM ( SELECT FLAVOR FROM ( SELECT * FROM FIRST_HALF UNION ALL SELECT * FROM JULY ) GROUP BY FLAVOR ORDER BY sum(TOTAL_ORDER) DESC )..
[프로그래머스] Oracle - (SQL 고득점 Kit) JOIN 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 문제 CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 2) 자동차 종류가 '세단' 또는 'SUV' 인 자동차 중 3) 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하고 2) 30일간의 4) 대여 금액이 50만원 이상 200만원 미만인 자동차에 대해서 자동차 ID, 자동차 종류, 대여 금액(컬럼명: FEE) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 자동차 종류를 기준으로 오름차순 정렬, 자동차 종류까지 같은 경우 자동차 ID를 기준으로 내림차순 정렬해주세요. 문제 풀이 이 문..
[프로그래머스] Oracle - (SQL 고득점 Kit) JOIN 그룹별 조건에 맞는 식당 목록 출력하기 문제 MEMBER_PROFILE와 REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요. 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고, 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬해주세요. 문제 풀이 처음에는 GROUP BY를 두 번 사용하는 방법밖에 떠오르지 않았다. 그렇게 정답을 제출하고 나서 다른 사람의 풀이도 보게 되었는데, RANK를 이용한 풀이 방법이 있어서 같이 정리해보았다. HAVING 조건을 이용한 풀이 리뷰를 가장 많이 작성한 회원을 찾기 위하여 회원별 GROUP BY로 묶는다. (HAVING 서브쿼리) 그 중 리뷰의 개수를 알기 위하여 count 함수로 조회한..
[프로그래머스] Oracle - (SQL 고득점 Kit) JOIN 조건에 맞는 도서와 저자 리스트 출력하기 문제 다음은 어느 한 서점에서 판매중인 도서들의 1) 도서 정보(BOOK), 저자 정보(AUTHOR) 테이블입니다. 2) '경제' 카테고리에 속하는 도서들의 도서 ID(BOOK_ID), 저자명(AUTHOR_NAME), 출판일(PUBLISHED_DATE) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 출판일을 기준으로 오름차순 정렬해주세요. 문제 풀이 BOOK 테이블과 AUTHOR 테이블을 JOIN 한다. '경제' 카테고리에 속하는 도서만 뽑기 위하여 WHERE 조건을 건다. 전체 코드 SELECT a.BOOK_ID, b.AUTHOR_NAME, TO_CHAR(a.PUBLISHED_DATE, 'YYYY-MM-DD') AS PUBLISHED_DATE FROM BOOK a JOIN AUTHOR b ON a...
[프로그래머스] Oracle - (SQL 고득점 Kit) GROUP BY 가격대 별 상품 개수 구하기 문제 PRODUCT 테이블에서 1) 만원 단위의 가격대 별로 2) 상품 개수를 출력하는 SQL 문을 작성해주세요. 이때 컬럼명은 각각 컬럼명은 PRICE_GROUP, PRODUCTS로 지정해주시고 가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시해주세요. 결과는 가격대를 기준으로 오름차순 정렬해주세요. 문제 풀이 만원 단위의 가격대 별로 조회하기 위하여 GROUP BY로 묶는다. 상품 개수를 구하기 위하여 count 함수로 조회한다. - TRUNC(PRICE, -4)를 사용한 이유 : 기존에 아래와 같이 SUBSTR() 함수를 사용하여 앞 부분만 잘라낸 후 다시 10000을 곱해주었다면, TRUNC는 지정한 자릿수를 반올림 해주지 않고 자르기..
[프로그래머스] Oracle - (SQL 고득점 Kit) GROUP BY 입양 시각 구하기(2) 문제 보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 1) 각 시간대별로 2) 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다. 문제 풀이 각 시간대 별로 조회하기 위하여 GROUP BY로 묶는다. 총 입양 건수를 구하기 위하여 count 함수로 조회한다. 0~23까지 CONNECT BY LEVEL 구문으로 순차목록을 만들어 위의 서브쿼리와 LEFT OUTER JOIN 한다. (LEFT OUTER JOIN : 왼쪽에 오는 테이블의 데이터는 모두 조회하고, 오른쪽에 오는 ANIMAL_OUTS 테이블에 입양 시간별 건수가 없는 경우에는 NULL로 JOIN 하기 위함) NVL 함수를 사용하여 오른쪽 쿼리에 들..
[프로그래머스] Oracle - (SQL 고득점 Kit) GROUP BY 년, 월, 성별 별 상품 구매 회원 수 구하기 문제 USER_INFO 테이블과 ONLINE_SALE 테이블에서 2) 년, 월, 성별 별로 3) 상품을 구매한 회원수를 집계하는 SQL문을 작성해주세요. 결과는 년, 월, 성별을 기준으로 오름차순 정렬해주세요. 이때, 1) 성별 정보가 없는 경우 결과에서 제외해주세요. 문제 풀이 USER_INFO와 ONLINE_SALE 테이블을 JOIN한 후, 성별 정보가 없는 경우는 제외하기 위하여 WHERE 조건을 건다. 년, 월, 성별 별로 조회하기 위하여 GROUP BY로 묶는다. 상품을 구매한 회원수를 구하기 위하여 count 함수로 조회한다. 단 각 회원은 한번씩 카운트 되어야 하기 때문에 DISTINCT로 중복을 제거한다. 전체 코드 SELECT TO_CHAR(SALES_DATE, 'YYYY') AS YEA..
[프로그래머스] Oracle - (SQL 고득점 Kit) GROUP BY 입양 시각 구하기(1) 문제 보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 1) 09:00부터 19:59까지, 2) 각 시간대별로 입양이 3) 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다. 문제 풀이 24시간으로 계산하며, 해당 시간 내 리스트를 조회하기 위하여 WHERE 조건을 건다. 각 시간대별로 조회하기 위하여 GROUP BY로 묶는다. 위의 조건에 해당하는 총 건수를 구하기 위하여 count 함수로 조회한다. 전체 코드 SELECT TO_NUMBER(TO_CHAR(DATETIME,'hh24')) AS HOUR, count(*) AS COUNT FROM ANIMAL_OUTS WHERE TO_CHAR(DATETIME, 'hh24') BETWEEN..