목록2024/06/10 (5)
YataNox

문제 처음 봤을 땐 이게 레벨 4? 라는 생각이 바로 들었다.NAME이 Milk인 경우와 Yogurt인 경우를 구해서 INTERSECT를 통해서 교집합인 CART_ID를 뽑아냈다.이후 다른 사람이 푼 것을 봤는데 이 방식도 재밌었다.NAME이 milk, Yogurt인 것들만 도출해서 cart_id를 기반으로 그룹화하고 중복제거한 NAME의 갯수가 2개인 것을 뽑아냈다. 이 방식도 흥미로워 둘 다 올려본다.코드SELECT CART_ID FROM CART_PRODUCTS WHERE NAME = 'Milk' INTERSECT SELECT CART_ID FROM CART_PRODUCTS WHERE NAME = 'Yogurt' ORDER BY 1 ASC; OR SELECT CART_ID FROM CART_PRO..

문제 조인 두 번만 하면 되는 문제이다.우선 APPOINTMENT 테이블에서 2022년 4월 13일 진료기록 중 예약이 취소되지 않은 CS(흉부외과) 데이터만 도출했다.이후 해당 테이블에 PATIENT, DOCTOR 테이블을 각각의 ID를 기준으로 조인해주고 출력했다. 코드WITH NOT_CANCEL_CS_AT413 AS ( SELECT * FROM APPOINTMENT WHERE (APNT_CNCL_YN = 'N' AND DATE_FORMAT(APNT_YMD, '%Y-%m-%d') = DATE_FORMAT('20220413', '%Y-%m-%d')) AND MCDP_CD = 'CS' ) SELECT DISTINCT cna.APNT_NO, p...

문제 DEPT 테이블은 굳이 쓸 필요가 없었다.HR_GRADE의 EMP_NO을 기준으로 그룹화하고 SCORE의 평균을 이용해 CASE문으로 등급과 보너스 비율을 계산한다.이후 해당 테이블과 EMP 테이블을 조인하여 급여의 보너스 비율을 계산한다. 코드 WITH SCORE AS ( SELECT EMP_NO, CASE WHEN AVG(SCORE) >= 96 THEN 'S' WHEN AVG(SCORE) >= 90 THEN 'A' WHEN AVG(SCORE) >= 80 THEN 'B' ELSE 'C' END AS 'GRADE', CASE WHEN AVG(SCORE) >= 96 THEN 20 WHEN..

문제 우선 NULL일 길이를 다 10CM로 변경한 테이블을 생성하고 해당 테이블을 FISH_TYPE별로 그룹화하면서 AVG(LENGTH)가 33 이상인 값들만 살렸다. 코드 WITH FISH_INFO_NEW AS ( SELECT ID, FISH_TYPE, IFNULL(LENGTH, 10) AS 'LENGTH', TIME FROM FISH_INFO ) SELECT COUNT(*) AS 'FISH_COUNT', MAX(LENGTH) AS 'MAX_LENGTH', FISH_TYPE FROM FISH_INFO_NEW GROUP BY FISH_TYPE HAVING AVG(LENGTH) >= 33 ORDER BY 3 ASC;

문제 조인으로 처리를 해도 되지만 WITH로 작성한 글이 3개 이상인 WRITER_ID를 도출하고 USER_ID가 도출한 WRITER_ID와 동일한 유저의 정보만 출력하도록 기본 구조를 잡았다. 유저의 CITY, STREET_ADDRESS1,2를 합쳐서 출력하는 것은 CONCAT 메소드를 이용했으며,전화번호 같은 경우는 CONCAT과 동시에 SUBSTRING을 통해 중간 중간에 하이픈(-)을 삽입했다. 코드WITH BOARD AS ( SELECT DISTINCT WRITER_ID FROM USED_GOODS_BOARD GROUP BY WRITER_ID HAVING count(*) > 2 ) SELECT ugu.USER_ID, ugu.NICKNAME, CONCAT(ugu.CI..