- 오늘 진행한 일
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 를 해주는 것이 보기 편하다
자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기
자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 # SELECE절 서브쿼리
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고, 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을
lyj-01.tistory.com
대여종료일만 신경써서 대여 가능 여부를 확인하다보니
사실상 이도저도 아닌 데이터가 조회되었다.
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 조건을 따르게 되어
원하던 값이 아닌 다른 결과가 출력된다
![](https://blog.kakaocdn.net/dn/cVveV9/btsGjYBjH7r/RYnrlykgCuHToGK5opsbU0/img.png)
![](https://blog.kakaocdn.net/dn/bsLYQh/btsGlZlDILn/3DynRRRDn7nzQ1k2vPaR40/img.png)
서브쿼리를 했을때와 하지 않았을 때의 실행결과의 이유가
도저히 이해되지 않아 꽤나 오래잡고 있었던 문제이다.
결국에는 해결이 되어 뿌듯하다 !!!
파이썬
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 |