SQL 문제 65

문제 69. 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기(난이도 10)

문제를 보고 2022년 8월 01일 ~ 2022년 10월 31일 까지 총 5회 대여된CAR_ID 부터 구해야 한다는 생각을 했다.     SELECT CAR_ID     FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY     WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'     GROUP BY CAR_ID     HAVING COUNT(CAR_ID) >= 5 그렇게 구해진 CAR_ID를MONTH와 CAR_ID로 GROUP을 만들어그룹 테이블을 만들어줬다. 이후, SELECT ~~~~, COUNT(CAR_ID) AS RECORDS로 그룹 테이블의 개수를 출력해 월 별 대여 회수를 출력해줬다. 제출한 코드 :  SELECT MONTH(..

SQL 문제 2024.08.01

문제 68. 저자 별 카테고리 별 매출액(난이도 10)

문제를 보고 BOOK_SALES 테이블을 바탕으로2022년 1월 판매된 BOOK_ID의 판매량 합 테이블을 새로 만들어줬다. 만드는 방법으로는      SELECT BOOK_ID, SUM(SALES) AS SALES     FROM BOOK_SALES     WHERE SALES_DATE BETWEEN '2022-01-01' AND '2022-01-31'     GROUP BY BOOK_ID 으로 비교적 쉽게 만들 수 있었다. 이렇게 만들어진 테이블과 나머지 2개의 테이블을 3중 JOIN 시켜줬다.(이전 문제를 바탕으로 학습한 내용 사용) FROM BOOK AS A INNER JOIN AUTHOR AS B ON A.AUTHOR_ID = B.AUTHOR_ID INNER JOIN (     SELECT BO..

SQL 문제 2024.08.01

문제 67. 주문량이 많은 아이스크림들(난이도 10)(새 테이블 만들어 조회)

먼저 7월 아이스크림의 FLAVOR에 따른 TOTAL_ORDER 합을구해야겠다고 생각했다. 하지만, 그 이후에 어떻게 해야할지방법이 떠오르지 않았다. 그래서, 다른 사람의 코드를 보니 JULY에 대한 FLAVOR이 같은 TOTAL_ORDER를더 한 새 테이블을 만들어주고 FIRST_HALF 테이블과 INNER JOIN으로 두 테이블 간의TOTAL_ORDER의 합을 기준으로 내림차순 정렬 했었다. JULY에 대한 FLAVOR이 같은 TOTAL_ORDER를더 한 새 테이블을 만드는 방법으로는 FROM FIRST_HALF AS AINNER JOIN  (     SELECT SHIPMENT_ID, FLAVOR, SUM(TOTAL_ORDER) AS TOTAL_ORDER     FROM JULY     GROUP ..

SQL 문제 2024.08.01

문제 66. 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기(난이도 6)

처음에WHERE A.VIEWS IN(     SELECT MAX(VIEWS)     FROM USED_GOODS_BOARD )으로 WHERE 문을 잘못 작성해서 시간을 오래 끌었다... 오류를 수정한 코드는WHERE A.VIEWS =(    SELECT MAX(VIEWS)    FROM USED_GOODS_BOARD)으로 찾고자 하는 값이 받아 왔어야 했다. 이후, CONCAT 함수로 CONCAT('/home/grep/src/',B.BOARD_ID,'/',B.FILE_ID,B.FILE_NAME,B.FILE_EXT)출력해야 하는 내용을 붙여줬다. 제출한 코드 :  SELECT CONCAT('/home/grep/src/',B.BOARD_ID,'/',B.FILE_ID,B.FILE_NAME,B.FILE_EXT)..

SQL 문제 2024.08.01

문제 65. 우유와 요거트가 담긴(난이도 10)(집합 연산자)

처음에 2중 SELECT문으로 어떻게든풀어볼려고 시도를 했는데도무지 풀 수가 없었다... 다른 사람들의 코드를 찾아보니,집합 연산자를 활용해 문제를 해결했다.집합 연산자에는연산자의미결과UNION합집합중복 제거한 결과의 합을 검색UNION ALL중복을 포함한 결과의 합을 검색INTERSECT교집합양쪽 모두에서 포함된 행을 검색  EXCEPT(Oracle : MINUS)차집합첫 번째 검색 결과에서 두 번째 검색 결과를 제외한 너머지를 검색 합집합인 UNION, UNION ALL은 SELECT 컬럼FROM 테이블 UNION SELECT 컬럼FROM 테이블 로 가능했다.   교집합인 INTERSECT는 SELECT 컬럼FROM 테이블 INTERSECT SELECT 컬럼FROM 테이블 로 가능했다.   차집합인 ..

SQL 문제 2024.07.30

문제 64. 헤비 유저가 소유한 장소2021(난이도3)

문제를 보면 HOST_ID를 바탕으로 그룹 테이블을 만들어야 한다.이때, HOST_ID가 2번 이상인 대상만그룹 테이블로 만들어져야 한다. 그리고 그렇게 만들어진 그룹 테이블의 HOST_ID를 바탕으로 전체 조회돼야 한다. -> 2중 SELECT 문으로 적성돼야 한다. 제출한 코드 :  SELECT * FROM PLACES WHERE HOST_ID IN (     SELECT HOST_ID     FROM PLACES     GROUP BY HOST_ID     HAVING COUNT(HOST_ID) >= 2 )

SQL 문제 2024.07.30

문제 63. 자동차 평균 대여 기간 구하기(난이도 5)

일단 CAR_ID의 대여 평균일을 구해야 하기 때문에,GROUP BY CAR_ID로 각각의 CAR_ID에 해당하는 구룹 테이블을 만들어줬다. 그 후, 평균 7일 이상 인 자동차만 조회 되도록 해야하는데 처음에는 WHERE에WHERE ROUND(AVG(DATEDIFF(SUBSTRING(END_DATE,1,11), SUBSTRING(START_DATE,1,11)) + 1),1)  >= 7로 구현했었다. 그런데, 오류가 나서 HAVING절로 옮겨주겨HAVING ROUND(AVG(DATEDIFF(SUBSTRING(END_DATE,1,11), SUBSTRING(START_DATE,1,11)) + 1),1)  >= 7로 구현하니 정상 작동했다... 아마도, CAR_ID의 구룹 테이블이 만들어져야 하는 조건이평균 7..

SQL 문제 2024.07.30

문제 62. 자동차 대여 기록에서 장기/단기(난이도 7)(날짜 차이 구하기)

2022년 9월에 속하는 대여 기록에 대해서 조회를 해야하기 때문에 대여 시작일 BETWEEN BETWEEN '2022-09-01' AND '2022-09-30'으로 9월이 대여 시작일인 튜플들만 조회 가능하게 만들었다. 그 후,  CASEWHEN 마지막 일 - 시작 일 >= 30 THEN '장기 대여'ELSE '단기 대여'END AS RENT_TYPE 으로 표현해줬는데, 정확한 '장기 대여', '단기 대여'를구별하지 못 했다. 인터넷에서 날짜 차이 함수를 찾아보니DATEDIFF(날짜1, 날짜2) : 날짜1 - 날짜2 차이를 일수로 반환TIMESTAMPDIFF(단위, 날짜1, 날짜2) : 날짜1 - 날짜2 차이를 선택한 단위로 반환 단위표SECOND초MINUTE분HOUR시DAY일WEEK주MONTH월QUA..

SQL 문제 2024.07.30

문제 61. 서울에 위치한 식당 목록(난이도 5)

문제의 내용이 길지만, 요구 사항을 바탕으로 잘 작성하면 쉽게 풀 수 있는 문제이다.문제에서 '서울'에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를조회해야 하는데 혹시나, 구 읍, 로 등에 '서울'이라는 단어가 포함된 주소가 있을 수 있기 때문에SUBSTRING()으로 '서울'이 들어가는 '시'만 추출했다. GROUP BY 레스토랑 ID로 그룹을 묶지 않으면,그 레스토랑의 평점 평균값을 정확하게 계산할 수 없다. 제출한 코드 :  SELECT A.REST_ID, A.REST_NAME, A.FOOD_TYPE, A.FAVORITES, A.ADDRESS, ROUND(AVG(B.REVIEW_SCORE), 2) AS SCORE FROM REST_INFO AS A IN..

SQL 문제 2024.07.30

문제 60. 년, 월, 성별 별 상품 구매 회원 수 구하기(난이도 7)

문제에 요구 사항이 굉장히 많다. 요구 사항을빼먹지 않고 잘 작성하면 비교적 간단하다. 제출한 코드 :  SELECT YEAR(B.SALES_DATE) AS YEAR, MONTH(B.SALES_DATE) AS MONTH, A.GENDER AS GENDER, COUNT(DISTINCT A.USER_ID) AS USERS FROM USER_INFO AS A INNER JOIN ONLINE_SALE AS B ON A.USER_ID = B.USER_ID WHERE A.GENDER IS NOT NULL GROUP BY YEAR, MONTH, GENDER ORDER BY YEAR ASC, MONTH ASC, GENDER ASC

SQL 문제 2024.07.30