인프런 커뮤니티 질문&답변

김현우님의 프로필 이미지
김현우

작성한 질문수

[개념반]배워서 바로 쓰는 SQL 쿼리

실습 문제 9-10 (Functions)

실습문제 9-10 질문

작성

·

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

Joe님의 프로필 이미지
Joe
지식공유자

안녕하세요 현우님

쿼리로 나온 결과 데이터를 재가공하고 싶으신 것으로 이해했는데요,

이 경우 서브쿼리를 사용해주시면 됩니다.

서브쿼리는 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
    ;

(코드 에디터가 있군요..?)

--

이렇게 쿼리를 돌리면 아래와 같은 결과가 나올거에요

image

서브쿼리는 이 처럼 사용할 수 있으며 무한히 중첩이 가능해요. 다만 말씀드린대로 원본 데이터를 사용하는 것이 아니기 때문에 너무 많이 중첩하게될 경우 db서버에 부하를 주어 실행속도가 느려질 수 있으니 실제 디비에서는 조심해야겠죠.

실행순서는 가장 안쪽에 있는 from 절부터 수행되어 바깥에 있는 쿼리들을 수행해 나가는 흐름입니다. 추가로 질문 더 있으시면 알려주세요!

김현우님의 프로필 이미지
김현우

작성한 질문수

질문하기