본문 바로가기

코딩테스트/SQL - 프로그래머스

(31)
SQL 고득점 kit(GROUP BY) - 즐겨찾기가 가장 많은 식당 정보 출력하기 -- 풀이 WITH MAX_FAV AS ( SELECT FOOD_TYPE , MAX(FAVORITES) AS FAVORITES FROM REST_INFO GROUP BY FOOD_TYPE ) SELECT R.FOOD_TYPE , R.REST_ID , R.REST_NAME , M.FAVORITES FROM REST_INFO R JOIN MAX_FAV M ON R.FAVORITES = M.FAVORITES GROUP BY FOOD_TYPE ORDER BY FOOD_TYPE DESC - 해설 1. WITH절로 FOOD_TYPE별 가장 높은 FAVORITES를 출력하는 MAX_FAV라는 테이블을 만듦. 2. 기존 REST_INFO 테이블과 JOIN해서 FOOD_TYPE별로 MAX_FAV의 FAVORITES와 같..
SQL 고득점 kit(SELECT) - 서울에 위치한 식당 목록 출력하기 조건을 잘 만족시켜야 하는 문제였다. 같은 결과가 출력되더라도, 답이 아닐 수 있다. -- 처음 풀이. 틀린 풀이. SELECT I.REST_ID , I.REST_NAME , I.FOOD_TYPE , I.FAVORITES , I.ADDRESS , ROUND(AVG(R.REVIEW_SCORE), 2) AS SCORE FROM REST_INFO I LEFT JOIN REST_REVIEW R ON I.REST_ID = R.REST_ID WHERE I.ADDRESS LIKE '서울%' GROUP BY R.REST_ID ORDER BY SCORE DESC, I.FAVORITES DESC; 아무리 봐도 틀린 곳이 없다고 생각했지만 역시나 그것은 내 생각일 뿐이었다. 조건을 잘 만족시키지 못했었다. -- 고친 정답 ..
SQL 고득점 kit(SELECT) - 3월에 태어난 여성회원 목록 출력하기 -- 풀이 SELECT MEMBER_ID , MEMBER_NAME , GENDER , DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d') AS DATE_OF_BIRTH FROM MEMBER_PROFILE WHERE MONTH(DATE_OF_BIRTH) = 3 AND GENDER = 'W' AND TLNO IS NOT NULL ORDER BY MEMBER_ID; - 어려운 문제는 아니나, 조건이 이것저것 많다. 1) 생일이 3월인 2) 여성의 정보를 출력하는데, 3) 전화번호가 NULL인 경우는 제외하고 4) 결과는 회원 ID 기준으로 오름차순 정렬하며 5) DATE_OF_BIRTH의 형식이 예시와 동일해야 한다. 조건을 잘 보아야 하는 문제였다.
SQL 고득점 kit(SELECT) - 흉부외과 또는 일반외과 의사 목록 출력하기 -- 풀이 SELECT DR_NAME , DR_ID , MCDP_CD , DATE_FORMAT(HIRE_YMD, '%Y-%m-%d') AS HIRE_YMD FROM DOCTOR WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS' ORDER BY HIRE_YMD DESC, DR_NAME; - DATE_FORMAT과 ORDER BY 사용법, WHERE절에 조건을 여러 개 걸 줄 아는가를 묻는 문제였다. 주의사항만 빼놓지 않으면 굉장히 평이한 문제였다.
SQL 고득점 kit(SELECT) - 평균 일일 대여 요금 구하기 -- 풀이 SELECT ROUND(AVG(DAILY_FEE), 0) AS AVERAGE_FEE FROM CAR_RENTAL_COMPANY_CAR WHERE CAR_TYPE = 'SUV'; - ROUND 함수와 WHERE절만 사용할 줄 알면 되는 쉬운 문제였다. 해설은 따로 하지 않는다.
SQL 고득점 kit(SELECT) - 오프라인/온라인 판매 데이터 통합하기 # 풀이 SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT FROM ONLINE_SALE WHERE SALES_DATE BETWEEN '2022-03-01' AND '2022-03-31' UNION ALL SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT FROM OFFLINE_SALE WHERE SALES_DATE BETWEEN '2022-03-01' AND '2022-03-31' ORDER BY SALES_DATE, PRODUCT_ID, USER_ID; - 해설 3월에 팔..
SQL 고득점 kit(SELECT) - 재구매가 일어난 상품과 회원 리스트 구하기 # 풀이 SELECT user_id , product_id FROM online_sale GROUP BY user_id, product_id HAVING COUNT(*) > 1 ORDER BY user_id, product_id desc; 해설 - SELECT user_id, product_id : user_id 컬럼의 데이터와 product_id 컬럼의 데이터를 출력하는데, - FROM online_sale : online_sale이라는 테이블에서, - GROUP BY user_id, product_id : user_id와 product_id를 기준으로 그룹화 하고(= user_id와 product_id의 조합별로 그룹을 만들고), - HAVING COUNT(*) >1 : 각 그룹 중 모든 컬럼의 데이..