SQL/MY SQL 문제 풀이(프로그래머스)

[MYSQL] PROGRAMMERS_보호소에서 중성화한 동물

SQL공부 2024. 2. 23. 17:24
반응형

SELECT distinct i.ANIMAL_ID, i.ANIMAL_TYPE, i.NAME
FROM ANIMAL_INS as i, ANIMAL_OUTS as o
WHERE i.ANIMAL_ID = o.ANIMAL_ID
AND i.SEX_UPON_INTAKE like "Intact%"
AND o.SEX_UPON_OUTCOME in ("Spayed Female","Neutered Male")
ORDER BY 1

문제

보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성

 

어렵지 않은 문제입니다.  (최근 제가쓴 게시글을 보니 가독성이 좋지않아 조금 가독성을 높여 보려합니다)

 

 코드를 어떻게 짤까 살짝 고민 했다가. 가장 쉽게 짜는 방법을 선택했습니다. IN과 OUT 양쪽 데이터가 모두 필요한 상황이므로 INNER JOIN으로 시작합니다.  추가로 각각 alias명을 설정해 줍니다.

 

 다음으로 각각 테이블이 공통으로 가지면서 유니크성을 지닌 컬럼 ANIMAL_ID 를 기준으로 연결해 줍니다.

 

 이제 주의 할 부분은 IN쪽 데이터와 OUT 쪽 데이터를 구분해서 필터 하는 것입니다. 중성화 수술의 데이터는 SEX_UPON_INTAKE와 SEX_UPON_OUTCOME 각각 두컬럼에 존재합니다.

 현재 주어진조건은 Intact ~ 일 경우 중성화가 안된 대상이고 Spayed , Neutered 일 경우는 중성화가 된 대상입니다.

이런 조건이 애매한경우 SELECT * FROM 테이블 을 통해서 어떤 데이터가 있는지 훑어보고 하면 좋습니다. 

그렇게 데이터를 확인 해보면 Spayed Female, Neutered Male 로 성별에 따른 중성화 데이터 인 것을  볼수 있습니다.

 

 위에 주어진 3 문자로 이제 중성화 전 -> 중성화 후 의 데이터를 필터링 해야하는데. 중성화 전의 데이터는 INTAKE에서 중성화 후의 데이터는 OUTCOME 에서 걸러야 하므로 각각의 조건으로 필터링 해줍니다. OUTCOME의 조건은 2가지 이므로 in 조건을 사용하여 or의 결과값을  얻어줍니다. 

 

그 후 정렬 하여 결과값을 추출하면됩니다.

 

반응형