- 오늘 진행한 일
1. 이번주 TIL 다시 한번 보기
2. SQL 코드카타(56~60번)
- 기억할 내용
SQL
INNER JOIN 을 여러번 할 경우
FROM appointment a
INNER JOIN patient p ON a.pt_no = p.pt_no
INNER JOIN doctor d ON a.mddr_id = d.dr_id
외래키 기준이 될 테이블을 제일 처음 적어주고
INNER JOIN 을 한 다음 연결해줄 테이블만 적어주면 된다
INNER JOIN = JOIN 같은 의미이므로 INNER 은 빼주어도 되지만
나중에 조금더 SQL이 익숙해졌을 때 제외하는거로 ..
테이블명에 별칭을 붙이는 작업도 AS 를 해주는 것이 보기 편하다
자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기
대여종료일만 신경써서 대여 가능 여부를 확인하다보니
사실상 이도저도 아닌 데이터가 조회되었다.
SELECT car_id
, CASE WHEN end_date >='2022-10-16' THEN "대여중"
WHEN end_date<'2022-10-16' THEN "대여 가능" END AILABILITY
, end_date
, start_date
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY car_id
HAVING max(end_date)
ORDER BY 1 DESC
당연히 정답은 아니었고
10월16일 이후 대여 가능한지~ 만 찾았더니 또 이상한 상태가 나와버렸다
select car_id
, CASE WHEN end_date >='2022-10-16' THEN "대여중"
WHEN end_date<'2022-10-16' THEN "대여 가능" END AILABILITY
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
where (car_id,end_date) IN
(
select car_id, max(end_date)
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
group by car_id
)
order by car_id DESC
제일 마지막 대여종료일이 전부다 10월16일 보다 컸기 때문에
전부 대여중이라고 나옴 ..
다른 쿼리들을 찾다보니 start_date 도 조건으로 줘야한다는 것을 깨달았다
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16'
10월16일 이전에 대여해서
10월16일 이후에 반납이 된 차량
(10월16일 당일에 대여중인 차량)
을 조회해주었다.
SELECT CAR_ID,
IF(CAR_ID IN
(SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16'), '대여중', '대여 가능')
AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;
select 절에 서브쿼리로 추가해서 대여조건을 지정해주었다!
SELECT 절의 서브쿼리는 열(컬럼) 처럼 취급된다.
Q. 서브쿼리를 사용하지 않고 그대로 IF 조건을 줄 경우에는 어떻게 나오는지?
A.
SELECT CAR_ID,
IF(START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16', '대여중', '대여 가능')
AS AVAILABILITY
, start_date
, end_date
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;
car_id 가 그룹화가 되어있어
start_date 와 end_date 에는 car_id 의 첫번째 행이 입력된다.
그렇기 때문에 첫번째 행을 기준으로 IF 조건을 따르게 되어
원하던 값이 아닌 다른 결과가 출력된다
서브쿼리를 했을때와 하지 않았을 때의 실행결과의 이유가
도저히 이해되지 않아 꽤나 오래잡고 있었던 문제이다.
결국에는 해결이 되어 뿌듯하다 !!!
파이썬
Q. 정수 n을 리스트로 생성하여 숫자연산을 하고 싶을 때 int 로는 바로 변환이 불가능한지?
A.
list(int(59))
이렇게 할 경우 5와 9가 따로 떨어져 나오는 것이 아니라 [59] 라는 숫자로 리스트가 만들어진다.
5와 9를 따로 떨어트려 계산을 하고 싶다면 문자열로 5와 9를 나누어 준 후
숫자형으로 바꾸어 계산을 해줘야 한다!
Q. 정수 n을 리스트로 생성하여 sort 할때 왜 list() 를 사용해야하는지?
A.
result = list(str(n))
result.sort(reverse = True)
이렇게는 되고
result = [str(n)]
result.sort(reverse = True)
이렇게 했을때 역순 정렬이 되지 않는 이유가 궁금했다.
다른 풀이 방식으로
answer = [int(i) for i in str(n)]
answer.sort(reverse=True)
이렇게 [] 대괄호를 사용했을 때에도 역순정렬이 정상적으로 진행되는 거로보아서는
리스트를 만드는 방식에는 차이가 없는 듯 하다
파이썬은 SQL 보다는 조금 덜 직관적이다보니
계속해서 궁금증이 생긴다..
왜 안되는거야
- 내일 진행 예정
1. SQL 코드카타
2. 알고리즘 코드카타
'TIL' 카테고리의 다른 글
2024-04-05 (0) | 2024.04.05 |
---|---|
2024-04-04 (0) | 2024.04.04 |
2024-04-02 (0) | 2024.04.02 |
2024-04-01 (0) | 2024.04.01 |
2024-03-31 (0) | 2024.03.31 |