https://school.programmers.co.kr/learn/courses/30/lessons/151137
코드설명
GROUP BY + LIKE 를 활용합니다.
문제에서 WHERE조건을 통하여 먼저 해당 옵션이 포함된 차들을 먼저 필터링합니다.
GROUP BY 에서 HAVING 절을 통한 필터링은 불가합니다. HAVING 절은 집계된 결과에 대한 필터링을 수행하는 데 사용하고, 해당 집계 함수를 사용한 열만을 참조할 수 있습니다. 즉, 집계된 결과에 대한 조건을 제공해야 합니다.
직설적으로 말하면, 이유는 SELECT 부분에서 해당 OPTIONS가 호출되지 않기에 사용되지 못합니다.
코드
SELECT CAR_TYPE AS CAR_TYPE, COUNT(*) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE '%가죽시트%'
OR OPTIONS LIKE '%통풍시트%'
OR OPTIONS LIKE '%열선시트%'
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE ASC;
-- SELECT *
-- FROM CAR_RENTAL_COMPANY_CAR
-- WHERE OPTIONS LIKE '%통풍시트%' OR '%열선시트%' OR '%가죽시트%'
-- 처음에 오른쪽처럼 처리했는데, OR OPTIONS LIKE ~ , OR OPTINS LIKE 이렇게 각각 OR 논리연산자마다 조건을 각각 해줘야 합니다.
-- 처음에 틀린 방법입니다. WHERE OPTIONS LIKE '%통풍시트%' OR '%열선시트%' OR '%가죽시트%'
SELECT CAR_TYPE AS CAR_TYPE, COUNT(*) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE '%통풍시트%'
OR OPTIONS LIKE '%열선시트%'
OR OPTIONS LIKE '%가죽시트%'
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE ASC
ORACLE
LIKE를 사용하지 않고, REGEXP_LIKE를 사용했습니다.
물론 LIKE를 사용해도 됩니다만, 더 깔끔해집니다.
아직 ORACLE에 완전히 익숙하지는 않아서 REGEXP_LIKE 의 구현에 있어서 실수가 있었습니다.
1. 처음에는 아래와 같이 '[]' 대괄호로 묶고,
2. || 로 OR 연산을 처리하고,
3. 띄어쓰기가 존재
WHERE REGEXP_LIKE(CRCC.OPTIONS, '[통풍시트 || 열선시트 || 가죽시트]')
하지만 위의 3가지 를 모두 다른 것으로 변경시켜야 합니다.
대괄호로 묶는 것은 [ABC]라면, A B C 각 문자가 존재하는지 파악합니다.
우리가 원하는건 각 문자가 아닌 단어입니다. 그러므로 ( ) 를 사용하고, || 대신에 | 를 사용해야 합니다. 띄어쓰기를 없애주어야 띄어쓰기까지 검색하지 않습니다.
정답 코드입니다. 물론 이 코드도 LIKE 문을 사용할 수 있습니다.
SELECT CRCC.CAR_TYPE AS CAR_TYPE, COUNT(*) AS CARS
FROM CAR_RENTAL_COMPANY_CAR CRCC
WHERE REGEXP_LIKE(CRCC.OPTIONS, '(통풍시트|열선시트|가죽시트)')
GROUP BY CRCC.CAR_TYPE
ORDER BY CRCC.CAR_TYPE ASC