Загружаем каталог…
Загружаем каталог…
🔒 IS NULL https://school.programmers.co.kr/learn/courses/30/lessons/157340 🖋문제 다음은 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블입니다. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블은 아래와 같은 구조로 되어있으며, HISTORY_ID, CAR_ID, START_DATE, END_DATE 는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고, 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여 자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요. 이때 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시해주시고 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요. 💻코드 SELECT CAR_ID, CASE WHEN SUM(CASE WHEN (START_DATE<='2022-10-16' AND END_DATE >='2022-10-16') THEN 1 #'대여중' ELSE 0 #'대여 가능' END ) > 0 THEN '대여중' ELSE '대여 가능' END AS AVAILABILITY FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY GROUP BY CAR_ID ORDER BY CAR_ID DESC 🔑풀이 일단 문제가 CAR_ID 별로 2022-10-16 에 대여 가능 상태인지. 즉, START_DATE ~ END_DATE 사이에 2022-10-16 이 있는 데이터가 있는지에 대한 문제이다. SELECT CAR_ID, FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY GROUP BY CAR_ID ORDER BY CAR_ID DESC 일단 CAR_ID 별로니까 GROUP BY CAR_ID 인 것 까지는 알겠는데.. 처음에는 CAR_ID 로 그룹핑하고 그 그룹내에서 16일에 대여중인 데이터를 뽑아내기 위해 HAVING을 쓰면되지 않을까 생각했다. HAVING (START_DATE<='2022-10-16' AND END_DATE >='2022-10-16') 하지만 HAVING을 사용하면 2가지 문제가 발생했다. 첫번째는 GROUP BY CAR_ID 를 하면 하나의 CAR_ID 그룹 안에 여러 개의 START_DATE , END_DATE 가 존재한다. HAVING에서 START_DATE <= 처럼 컬럼을 직접 사용하면 이 그룹에 START_DATE가 여러 개 있는데 어떤 행의 START_DATE를 기준으로 판단해야 하는가? 라는 문제가 생긴다. 두번째는 첫번째 문제를 무시한다 쳐도 HAVING은 그룹화된 결과에서 조건을 만족하는 그룹만 남기기 때문에 HAVING으로 대여중인 기록을 조건으로 걸면 대여중인 CAR_ID만 출력되고 대여 가능한 CAR_ID는 결과에서 사라진다. 문제에 대해 GPT에게 힌트를 물어본 결과 힌트는 집계함수 였다. SELECT COUNT(SCORE) FROM CAR GROUP BY ID 집계함수는 각 그룹의 여러행을 대상으로 계산을 해준다. 일단 집계함수는 그룹내에서 계산을 해주기 때문에 어떤 집계함수를 쓰면 좋을지 고민했다. 각 CAR_ID의 그룹 안에 2022-10-16에 대여중인 데이터가 하나라도 있는지를 확인하면 된다. 그래서 각 대여 기록을 먼저 CASE WHEN을 이용해서 1과 0으로 만들어서 그 합이 1 이상이라면 해당 그룹 내에 2022-10-16 대여중인 데이터가 있다는것을 파악할 수 있다. 이렇게 하면 각 대여 기록마다 2022-10-16 에 대여중인지 여부를 1 또는 0 으로 표현할 수 있다. CASE WHEN START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16' THEN 1 ELSE 0 END 물론 저렇게만 사용하면 HAVING을 사용할 때 발생하는 첫번째 문제와 같은 문제가 발생한다. 하지만 CASE WHEN 을 집계함수 안에서 사용하면, GROUP BY 로 만들어진 각 그룹의 행들을 대상으로 CASE WHEN 이 각각 평가되고, 그 결과를 집계함수가 계산한다. 그래서 SUM() 으로 더하면 해당 자동차가 2022-10-16 에 대여중인 기록이 몇 개 있는지 알 수 있다. SUM() > 0 인지 확인하면 해당 CAR_ID 에 2022-10-16 에 대여중인 기록이 하나라도 있는지 알 수 있다. 이 결과를 다시 CASE WHEN 으로 처리해서 1개 이상이면 대여중, 0이면 대여 가능으로 표시하면 된다. 🧐후기 GROUP BY 를 했다고 해서 그룹 안의 여러 행이 하나의 행으로 사라지는 것이 아니라, 집계함수를 이용하면 그룹 안의 여러 행을 대상으로 계산할 수 있다. WHERE 과 HAVING 은 조건에 맞지 않는 행을 제거하고 출력한다. WHERE 과 HAVING 차이는 WHERE 는 GROUP BY 이전에 개별 행을 필터링 하고 HAVING 은 GROUP BY 이후에 그룹을 필터링 한다. CASE WHEN 은 데이터를 필터링하는 것이 아니라 조건에 따라 값을 변환 할 수 있다. 집계함수 내에서 CASE 문을 활용할 수 있다.
То, что RADAR обнаружил и классифицировал для этой возможности. Это опубликованный источником текст, а не подтверждение, что предложение ещё действует.
[SQL] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기. 🔒 IS NULL https://school.programmers.co.kr/learn/courses/30/lessons/157340 🖋문제 다음은 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블입니다. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블은 아래와 같은 구조로 되어있으며, HISTORY_ID, CAR_ID, START_DATE, END_DATE 는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 2022년 10월 16일에…
Открыть источник