https://school.programmers.co.kr/learn/courses/30/lessons/157340
습득한 점:
레벨 3문제지만, 코드 길이에 관계없이 지금까지 풀었던 문제중에서 가장 까다로웠고,
깨닫게 된 점이 많았다.
문제를 마주하면 이해하기 좋은 코드 작성하고자,
반복적으로 필요하지 않고 해당 함수가 꼭 필요하지 않음에도, With 구문을 습관적으로 활용해서 문제를 풀곤 했었다.
덕분에 이해하기는 편했으나, 코드 줄 수가 너무 길어지는 단점이 있었다.
결과적으론... 이해하는 것이 코드를 작성한 나만 쉽지 않을까? 생각들었다.
DA가 sql 코드 성능을 신경 쓸 필요는 별로 없겠지만, 그래도 기존에 해왔던 파이썬이나 자바처럼 좀 더 컴팩트하게 작성하면 좋지 않을까?
앞으로는 가독성도 가독성이지만, 최대한 컴팩트하게 작성해보고자 한다.
- IF구문의 새로운 활용법:
* 기본적으로 IF(조건,True값,False값) 의 형태로 작성되지만,
IF(컬럼 IN (원하는 서브쿼리),True,False) 의 형태로도 작성될 수 있다.
- GROUP BY 특성:
* GROUP BY를 MAX()와 같은 함수와 사용할 때, run을 눌러서 나타나는 테이블은 컬럼들이 MAX()함수로 계산된 컬럼을 제외하고
다른 컬럼들은 서로 관계성을 지니지 않음.
* 보통 원본 테이블에서 보여지는 그룹 별 첫번째 값들이 보여지게 되어 있음.
문제:
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서
2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고,
대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여
자동차 ID와 AVAILABILITY 리스트를 출력하는 쿼리 작성
이때 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시
결과는 자동차 ID를 기준으로 내림차순 정렬
문제파악:
2022-10-16일에 대여가 가능한지의 여부를 찾는 문제
CAR_ID를 고유값으로 뽑아내야 해서 많이 헤맷다.
위 예시에서, CAR_ID의 2,3번째 데이터는 대여시작일과 대여종료일 사이에 10-16가 걸쳐있어서
결과테이블에서는 '대여중'으로 표시되어야 하고 나머지 데이터는 표현되지 않아야 한다.
IF구문 내, 서브쿼리를 활용해서,
조건에 해당되는 값이, 서브쿼리로 인해 뽑힌 데이터 내에 단 한개라도 들어있다면, '대여중',
존재하지 않는다면, '대여 가능'으로 표시되도록 작성 후 alias 를 지정한 뒤, 이를 SELECT절에 CAR_ID 컬럼과 함께 삽입했다.
이로써 조건에 맞는 CAR_ID와, 대여 여부를 판단한 AVAILABILITY를 테이블에서 확인할 수 있다.
풀이:
SELECT DISTINCT CAR_ID
, IF(CAR_ID IN(SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE '2022-10-16' BETWEEN START_DATE AND END_DATE),'대여중','대여 가능') AS AVAILABILTIY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
ORDER BY CAR_ID DESC
'sql > hard' 카테고리의 다른 글
Leetcode 601 - Human Traffic of Stadium (0) | 2024.03.26 |
---|---|
프로그래머스 Lv 4 - 그룹별 조건에 맞는 식당 목록 출력하기 (0) | 2023.07.06 |