문제 연속으로 세번 같은 숫자가 주어지는 경우, 해당 숫자를 출력하는 문제이다. 접근법 총 3가지 방법으로 접근해볼 수 있다 : (1) JOIN - 내가 푼 풀이, (2) 셀프조인, (3) 윈도우 함수 LEAD 사용 (1) 다소 스튜핏한 JOIN 풀이 (처음 푼 풀이) 셀프 조인을 생각하지 못하고 매번 LOGS 테이블을 불러와서 조인해주는 방식인데, 결국 이걸 간단히 구현한게 셀프조인이기 때문에 자연스럽게 셀프 조인 개념을 배우고 나서는 이 방법을 절대 하지 않게 될 것이다.. SELECT DISTINCT LNUM AS ConsecutiveNums FROM (SELECT L.ID AS LID, L.NUM AS LNUM, T.ID AS TID, T.NUM AS TNUM, THR.ID AS THRID, TH..
문제 두개의 Employeement, Department 테이블 존재 각 부서에서 가장 높은 임금을 받는 직원들의 정보만 추출하기 접근법 총 3가지 방식으로 문제를 풀 수 있다: (1) 서브쿼리 절 풀이 (2) 윈도우 함수 MAX (3) 윈도우 함수 DENSE_RANK()다 (1) 서브쿼리 풀이법 SELECT D.NAME AS DEPARTMENT , E.NAME AS EMPLOYEE , E.SALARY AS SALARY FROM EMPLOYEE E INNER JOIN DEPARTMENT D ON E.DEPARTMENTID = D.ID WHERE(E.DEPARTMENTID, E.SALARY) IN (SELECT DEPARTMENTID, MAX(SALARY) FROM EMPLOYEE GROUP BY DEP..
SELECT M.MEMBER_NAME, R.REVIEW_TEXT, DATE_FORMAT(R.REVIEW_DATE,'%Y-%m-%d') as REVIEW_DATE FROM MEMBER_PROFILE M JOIN REST_REVIEW R ON M.MEMBER_ID = R.MEMBER_ID WHERE M.MEMBER_ID IN ( SELECT MEMBER_ID FROM REST_REVIEW GROUP BY MEMBER_ID HAVING COUNT(*) = ( SELECT COUNT(*) AS CNT FROM REST_REVIEW GROUP BY MEMBER_ID ORDER BY CNT DESC LIMIT 1 )) ORDER BY REVIEW_DATE, REVIEW_TEXT; 서브 쿼리를 이중으로 쓰는 게 포인..
WITH TRUCK AS ( SELECT H.HISTORY_ID , C.CAR_TYPE , C.DAILY_FEE , DATEDIFF(H.END_DATE, H.START_DATE) + 1 AS DIFF , CASE WHEN DATEDIFF(H.END_DATE, H.START_DATE) + 1 >= 90 THEN '90일 이상' WHEN DATEDIFF(H.END_DATE, H.START_DATE) + 1 >= 30 THEN '30일 이상' WHEN DATEDIFF(H.END_DATE, H.START_DATE) + 1 >= 7 THEN '7일 이상' ELSE 'NONE' END AS DURATION_TYPE FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY H INNER JOIN CAR_..
SELECT CONCAT('/home/grep/src/', B.BOARD_ID, '/', F.FILE_ID, F.FILE_NAME, F.FILE_EXT) AS FILE_PATH FROM USED_GOODS_BOARD B JOIN USED_GOODS_FILE F ON B.BOARD_ID = F.BOARD_ID WHERE VIEWS = (SELECT MAX(VIEWS) FROM USED_GOODS_BOARD) ORDER BY FILE_ID DESC; (1) 데이터 필터링: 조회수가 가장 높은 경우를 필터링 하기 위해 서브 쿼리를 이용해서 max(view)를 통해 최대 조회수를 구한다. (2) 두 테이블 결합 JOIN: 두 테이블 정보를 모두 이용하기 위해 JOIN을 한다 (3) 문자열 결합: CONCAT 함..
난이도가 상당한 문제..! (괜히 별 4개가 아니다:) [Key Points] 0시~23시까지 시간대별 입양 건수를 요약하는 문제인데 포인트는 COUNT 함수의 경우 결측치를 제외하고 집계한다는 것이다. 즉, 0시, 1시 등 입양 현황에 없는 시간대는 요약이 안되는 문제가 발생한다. 데이터에 없는 시간까지 표시하고 싶다면 결국 '0시~24시'에 대한 테이블을 만들어준 뒤 - 문제의 ANIMAL_OUTS와 결합해주어야 한다. (1) 시간 테이블 생성하기: 새로운 시간 정보를 만드는 것은 -> '변수 생성'을 의미하므로 @ 프로시저를 사용해 변수를 지정한다. 변수 생성 @: 변수 생성시 '='를 이용하고 뒤에 세미 콜론(;)을 붙힌다. 변수 대입시 ':='를 사용한다. 0~24까지 시간을 순차적으로 생성하기..
id별 월 수입을 Pivoting 해야 하는 문제로, '특정 정보를 새로운 열로' 생성하고 싶을 경우 CASE WHEN 구문을 이용해서 피봇팅한다. 먼저 ID 별로 정보를 요약하고 싶기 때문에 > GROUP BY ID를 작성한다 그 다음, CASE WHEN 을 이용해 월별 정보 열을 생성한다. SELECT ID, SUM(CASE WHEN MONTH = 'Jan' THEN REVENUE ELSE NULL END) AS 'Jan_Revenue', SUM(CASE WHEN MONTH = 'Feb' THEN REVENUE ELSE NULL END) AS 'Feb_Revenue', SUM(CASE WHEN MONTH = 'Mar' THEN REVENUE ELSE NULL END) AS 'Mar_Revenue', ..
SELECT A.AUTHOR_ID, A.AUTHOR_NAME, B.CATEGORY, SUM(S.SALES*B.PRICE) AS TOTAL_SALES FROM BOOK AS B JOIN AUTHOR AS A ON B.AUTHOR_ID = A.AUTHOR_ID JOIN BOOK_SALES AS S ON B.BOOK_ID = S.BOOK_ID WHERE DATE_FORMAT(SALES_DATE,'%Y%m') = 202201 GROUP BY AUTHOR_ID, CATEGORY ORDER BY AUTHOR_ID, CATEGORY DESC; 3개의 테이블 정보를 이용해 1월의 저자별, 카테고리별 매출 총액을 이용해야 한다. 그래서 두개의 JOIN 구문을 이용해 3테이블을 결합해준다. 그 다음 결합된 테이블 중 20..