이번에 다뤄볼 문제는 이중 조건 및 정렬을 활용하여 데이터를 조회하는 문제입니다.
https://school.programmers.co.kr/learn/courses/30/lessons/131697
프로그래머스 기준 Lv.1 문제이며, 풀이 후 해설과 함께 정리해보도록 하겠습니다.
문제에서 주어진 요구사항은 다음과 같습니다.
1. 의료진 테이블에서 진료과가 흉부외과 혹은 일반외과인 데이터만을 조회 2. 이 때, 의사의 이름, ID, 진료과, 고용일자 컬럼에 대해 조회 3. 조회 결과는 고용일자를 기준으로 내림차순 정렬 4. 만약 고용일자에 중복이 있다면, 이름을 기준으로 오름차순 정렬
이를 해결하기 위해선 2개의 조건 처리 및 다중 정렬 대한 처리가 각각 필요합니다.
또한 고용일자 데이터는 예시 포맷과 동일하게 년/월/일 형태로 정리해주어야 합니다.
이러한 요구사항에 맞추어 조합하여 주어진 문제에 대한 SQL문을 작성해보겠습니다.
가장 먼저 조회가 필요한 컬럼들과 테이블에 대한 SELECT 문을 작성합니다.
SELECT DR_NAME, DR_ID, MCDP_CD, HIRE_YMD FROM DOCTOR;
다음으로 데이터 중 진료과가 '흉부외과' 혹은 '일반외과'인 데이터만을 조회합니다.
이를 WHERE을 사용하여 간단하게 구현할 수 있으며 OR 조건을 통해 묶어줍니다.
OR 조건을 통해 진료과가 흉부외과이거나 (OR) 일반외과인 데이터만을 조회합니다.
SELECT DR_NAME, DR_ID, MCDP_CD, HIRE_YMD FROM DOCTOR WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS';
이후 고용일자를 기준 내림차순 및 고용일자가 같은 경우를 위해 다중 정렬을 정의합니다.
SELECT DR_NAME, DR_ID, MCDP_CD, HIRE_YMD FROM DOCTOR WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS' ORDER BY HIRE_YMD DESC, DR_NAME ASC;
마지막으로 고용일자 컬럼에 대해 포맷 변경 문제가 남아있습니다.
이는 TO_CHAR과 함께 문자 포맷 활용을 통해 간단하게 정리해줄 수 있습니다.
SELECT DR_NAME, DR_ID, MCDP_CD, TO_CHAR(HIRE_YMD, 'YYYY-MM-DD') AS HIRE_YMD FROM DOCTOR WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS' ORDER BY HIRE_YMD DESC, DR_NAME ASC;
복잡해보였지만 점진적 해결을 통해 손쉽게 해결해낼 수 있었습니다.
이번 문제 또한 단순 풀이는 맞았지만, 최적의 방법인지 알 수 없습니다.
다른 사람들의 코드를 읽고 배워가며, 최적화된 코드를 작성할 수 있도록 노력하겠습니다.
긴 글 읽어주셔서 감사합니다.