작성
·
241
1
안녕하세요
강의 문제 관련하여 추가 질문 있어서 남깁니다.
문제 10번은 카테고리 아이디 별로 기준을 주어 각각 소비재, 사치재, etc 로 분류를 하였는데요,
여기서 더 나아가서, 각각의 분류 대로 products 개수를 출력하고 싶습니다. (ex. 소비재 - 3개, 사치재 - 4개)
그렇게 되었을 때 생각한 쿼리는 아래와 같은데요,
select case when categoryID <= 3 then '소비재'
when categoryID between 4 and 5 then '사치재'
else 'etc' end as '분류',
count(distinct '분류') as '분류별 개수'
from products
;
위와 같은 쿼리 작성 시, 소비재 1개만 나오는 불완전한 결과가 출력됩니다.
해당 쿼리 작성문 궁금합니다.
감사합니다.
답변 1
0
안녕하세요 현우님
쿼리로 나온 결과 데이터를 재가공하고 싶으신 것으로 이해했는데요,
이 경우 서브쿼리를 사용해주시면 됩니다.
서브쿼리는 select.. 으로 나온 결과를 마치 하나의 테이블처럼 사용할 수 있게해주는 건데요, 이 경우 실제로 존재하는 원본데이터는 아니기 때문에 '뷰'라고 부르게 됩니다. 사용법은 from 뒤에 ()로 작성하는 select쿼리를 감싸주시고 () 뒤에 별칭으로 사용할 이름을 적어주시면 됩니다.
쿼리로 먼저 한번 보실까요 사용 예시는 아래와 같아요
---
select cat, count(distinct ProductID) as cnt
from
(
select ProductID, case when categoryID <= 3 then '소비재'
when categoryID between 4 and 5 then '사치재'
else 'etc' end as cat
from products
) a
group by cat
;
(코드 에디터가 있군요..?)
--
이렇게 쿼리를 돌리면 아래와 같은 결과가 나올거에요
서브쿼리는 이 처럼 사용할 수 있으며 무한히 중첩이 가능해요. 다만 말씀드린대로 원본 데이터를 사용하는 것이 아니기 때문에 너무 많이 중첩하게될 경우 db서버에 부하를 주어 실행속도가 느려질 수 있으니 실제 디비에서는 조심해야겠죠.
실행순서는 가장 안쪽에 있는 from 절부터 수행되어 바깥에 있는 쿼리들을 수행해 나가는 흐름입니다. 추가로 질문 더 있으시면 알려주세요!