WITH A AS(
SELECT CAR_ID, ROUND(AVG(END_DATE - START_DATE + 1), 1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID)

SELECT *
FROM A
WHERE AVERAGE_DURATION >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC
;

 

<포인트 정리>

 

1. 다중행 연산 사용할 때는 GROUP BY 거의 사용한다고 생각하면 된다.

 

2. 사용한 날짜 같은 개념을 계산할 때는 +1 꼭 해주기

SELECT BOARD_ID, WRITER_ID, TITLE, PRICE,

CASE
    WHEN 'DONE' = STATUS THEN '거래완료'
    WHEN 'SALE' = STATUS THEN '판매중'
    WHEN 'RESERVED' = STATUS THEN '예약중'
END AS STATUS

FROM USED_GOODS_BOARD

WHERE TRUNC(CREATED_DATE) = TO_DATE('2022-10-5', 'YYYY-MM-DD')

ORDER BY BOARD_ID DESC
;

 

 

<포인트 정리>

 

1. TRUNC 함수 및 SQL 문법 규칙

 

SELECT BOARD_ID, WRITER_ID, TITLE, PRICE, STATUS

FROM USED_GOODS_BOARD

WHERE TRUNC(CREATED_DATE) = TO_DATE('2022-10-5', 'YYYY-MM-DD');

 

여기서 마지막 줄을

 

WHERE '2022-10-5' IN TO_CHAR(CREATED_DATE, 'YYYY-MM-DD')

 

이렇게 하면 안된다.(SQL 문법상 안된다는 듯 하다.)

 

저기서 TRUNC함수를 사용하면 DATE 형식의 데이터에서 시간만 없애준다.

 

2. CASE문에서 여러 조건 시 ',' 사용하면 안됨.

 

오류남. 그냥 줄 건너뛰면 됨.

 

 

SELECT COUNT(*) AS COUNT
FROM(SELECT NAME, COUNT(NAME)
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME)
;

 

이것도 가능하지만 

 

SELECT COUNT(DISTINCT NAME) AS COUNT
FROM ANIMAL_INS
WHERE NAME IS NOT NULL;

 

DISTINCT를 사용하여 간결하게 표현도 가능!

+ Recent posts