본문 바로가기

코딩테스트

(50)
SQL 고득점 kit(JOIN) - 5월 식품들의 총매출 조회하기 프로그래머스 문제 https://school.programmers.co.kr/learn/courses/30/lessons/131117 풀이 https://school.programmers.co.kr/questions/74114 # 풀이 쿼리 SELECT P.PRODUCT_ID , P.PRODUCT_NAME , SUM(O.AMOUNT) * P.PRICE AS TOTAL_SALES FROM FOOD_PRODUCT P LEFT JOIN FOOD_ORDER O ON P.PRODUCT_ID = O.PRODUCT_ID WHERE O.PRODUCE_DATE BETWEEN '2022-05-01 00:00:00' AND '2022-05-31 23:59:59' GROUP BY P.PRODUCT_ID ORDER BY TOT..
SQL 고득점 kit(JOIN) - 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 프로그래머스 문제 https://school.programmers.co.kr/learn/courses/30/lessons/157339 풀이 https://school.programmers.co.kr/questions/73884 -- 풀이 쿼리 SELECT C.CAR_ID, C.CAR_TYPE , ROUND((30 * C.DAILY_FEE * (1-P.DISCOUNT_RATE/100))) AS FEE FROM CAR_RENTAL_COMPANY_CAR C LEFT JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H ON C.CAR_ID = H.CAR_ID LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN P ON C.CAR_TYPE = P.CAR_TYPE WH..
SQL 고득점 kit(GROUP BY) - 노선별 평균 역 사이 거리 조회하기 문제 https://school.programmers.co.kr/learn/courses/30/lessons/284531#qna 풀이 https://school.programmers.co.kr/questions/73074 -- 풀이 쿼리 SELECT ROUTE , CONCAT(ROUND(SUM(D_BETWEEN_DIST), 1), 'km') AS TOTAL_DISTANCE , CONCAT(ROUND(AVG(D_BETWEEN_DIST), 2), 'km') AS AVERAGE_DISTANCE FROM SUBWAY_DISTANCE GROUP BY ROUTE ORDER BY ROUND(SUM(D_BETWEEN_DIST), 1) DESC 문제 자체는 굉장히 쉬운 편에 속하지만.. 쉬운 것 치고 의외로 시간이 좀 ..
SQL 고득점 kit(GROUP BY) - 연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기 프로그래머스 문제 https://school.programmers.co.kr/learn/courses/30/lessons/284528#qna 풀이 https://school.programmers.co.kr/questions/72887 -- 풀이 쿼리 SELECT S.EMP_NO , E.EMP_NAME , CASE WHEN S.SCORE >= 96 THEN 'S' WHEN S.SCORE >= 90 THEN 'A' WHEN S.SCORE >= 80 THEN 'B' ELSE 'C' END AS GRADE , CASE WHEN S.SCORE >= 96 THEN E.SAL*0.2 WHEN S.SCORE >= 90 THEN E.SAL*0.15 WHEN S.SCORE >= 80 THEN E.SAL*0.1 ELSE 0..
SQL 고득점 kit(GROUP BY) - 조건에 맞는 사원 정보 조회하기 프로그래머스 문제 https://school.programmers.co.kr/learn/courses/30/lessons/284527#qna 풀이 https://school.programmers.co.kr/questions/72886 # 풀이 쿼리 SELECT SUM(G.SCORE) AS SCORE , G.EMP_NO , E.EMP_NAME , POSITION , EMAIL FROM HR_GRADE G LEFT JOIN HR_EMPLOYEES E ON G.EMP_NO = E.EMP_NO GROUP BY G.EMP_NO ORDER BY SUM(SCORE) DESC LIMIT 1; - 좀 더 복잡한 조건이거나, 추가로 뭔가 조건이 있었다면 ROW_NUMBER()를 써야 했을 것이다. 물론 이 문제도 ROW_..
SQL 고득점 kit(JOIN) - 주문량이 많은 아이스크림들 조회하기 이 문제는 2가지 방법으로 풀었다. -- 첫번째 풀이. UNION ALL 사용 SELECT FLAVOR FROM ( SELECT FLAVOR, TOTAL_ORDER FROM FIRST_HALF UNION ALL SELECT FLAVOR, TOTAL_ORDER FROM JULY ) BASE GROUP BY FLAVOR ORDER BY SUM(TOTAL_ORDER) DESC LIMIT 3 위 풀이처럼 척척척 풀고 ACCEPTED 되었는데, 제목을 보니 JOIN 파트였던 것... 물론 JOIN을 안 쓰고 풀었다고 해서 잘못된 건 아니지만, JOIN 파트 문제면 JOIN을 써 봐야 하지 않을까 싶어서 UNION 대신 JOIN을 쓰고 풀어 보았다. -- 2번째 풀이. JOIN 사용 SELECT F.FLAVOR F..
SQL 고득점 kit(IS NULL) - 업그레이드 할 수 없는 아이템 구하기 -- 풀이 쿼리 -- 다른 아이템의 PARENT_ITEM인 아이템들은 더 이상 업그레이드가 불가능하다. SELECT ITEM_ID , ITEM_NAME , RARITY FROM ITEM_INFO I WHERE I.ITEM_ID NOT IN ( SELECT DISTINCT PARENT_ITEM_ID FROM ITEM_TREE WHERE PARENT_ITEM_ID IS NOT NULL ) ORDER BY ITEM_ID DESC; - 풀이 쿼리에 써 놓은 것처럼, '더 이상 업그레이드가 불가능한 아이템'을 어떻게 필터링할지에 대한 조건만 명확히 이해한다면 어렵지 않은 문제다. https://school.programmers.co.kr/questions/72364
SQL 고득점 kit(GROUP BY) - 입양 시각 구하기(2) 처음에 문제만 읽었을 때엔 아니 띠용? 이렇게 쉬운 문제가 Lv 4? 라고 생각했으나, 예시 답안을 보니 Lv4일만 했다. 기록이 없는 빈 시간대의 데이터도 만들어야 했기 때문이다. 참고로 입양 시각 구하기(1) 문제는, 같은 것을 구하되 기록이 없는 빈 시간대는 고려할 필요가 없던 문제였고, Lv2 문제였다. 그래서 간단히 휘리릭 풀었었다. SELECT HOUR(DATETIME) AS HOUR , COUNT(*) AS COUNT FROM ANIMAL_OUTS GROUP BY HOUR ORDER BY HOUR 그런데, 기록 없는 빈 시간대의 데이터도 있어야 한다는 저 조건 하나만으로 Lv이 2단계나 뛴다? => 지금까지의 SQL 코테 풀이 짬으로 보아하니, 이건 문가 대단하게 어려운 쿼리를 짜야 풀린다기..