MYSQL 에서 TOP 대신 사용 하는 방법
TOP 함수를 생각했지만, 해당 함수는 SQL SERVER에서의 기능이었다.
ORDER BY로 원하는 기준에 따라 정렬하고, LIMIT를 통해 그 중 몇개를 얻어낼 것인지 정한다.
재귀 쿼리
없는 데이터를 0으로 변경해야 하는 문제 .
with recursive time as (select ㅁ uninall select ㅁ조건에 맞는 추가내용
where절에, 재귀의 조건을 정한다. )
이후 left outer join을 통해, 해당 테이블과 합친다.
조건
1. 넣고자 하는값, 그리고 1로 시작하는 값을 명명하여 넣는다(WHERE 또한 최초 시작 조건을)
2. UNION ALL
3. 해당 RECRUSIVE TABLE에서, 그 명명한 값 +1 을 재명명한다.
결과 : 하나씩 성장하여가는 값이 완성된다.
1,2,3,4,5,6,,7,8
논리적인 동작 순서에도 불구하고, SELECT 절의 별칭을 다른 곳에서 쓸 수 있다.
SELECT C.CAR_ID, C.CAR_TYPE, ROUND(C.DAILY_FEE * 30 * ((100-P.DISCOUNT_RATE)/100),0) AS FEE
FROM CAR_RENTAL_COMPANY_CAR C LEFT OUTER JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H
ON C.CAR_ID = H.CAR_ID LEFT OUTER JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN P
ON C.CAR_TYPE = P.CAR_TYPE
WHERE C.CAR_ID NOT IN (
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE ('2022-11-01 00:00:00' BETWEEN START_DATE AND END_DATE)
OR ('2022-11-30 00:00:00' BETWEEN START_DATE AND END_DATE))
AND C.CAR_TYPE IN('세단', 'SUV')
AND P.DURATION_TYPE = '30일 이상'
GROUP BY C.CAR_ID, C.CAR_TYPE
HAVING FEE BETWEEN 500000 AND 2000000
ORDER BY FEE DESC, CAR_TYPE ASC, CAR_ID DESC
논리적인 동작순서가 SELECT가 HAVING보다 낮지만, MYSQL은 특별히 SELECT를 먼저 스캔하고
논리적 동작을 따르기 때문에 HAVING절에서 AS는 쓸 수 있다.
CASE, WHEN, THEN, END
살짝 틀려버린점은, END를 까먹었단 점이다. 이런 실수는 주의하자.
++CASE 내부에서 집계함수를 쓸 수 없다. 그러므로
'코딩테스트' 카테고리의 다른 글
SQL 3 (0) | 2024.04.16 |
---|---|
고난이도 구현 문제 (0) | 2024.04.14 |
HASH (0) | 2024.03.17 |
SQL (0) | 2024.03.13 |
프로그래머스로 풀이 사이트 변경 (0) | 2024.03.13 |