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

전성배님의 프로필 이미지
전성배

작성한 질문수

초보자를 위한 BigQuery(SQL) 입문

2-5. 집계(GROUP BY + HAVING + SUM/COUNT)

2-5 집계 23:42 GROUP BY 연습문제 질문 드려요

해결된 질문

작성

·

28

·

수정됨

0

포켓몬의 수를 타입 별 집계, 수가 10 이상인 타입만 남기는 쿼리 작성 연습문제에 대하여 질문 드려요.

 

작성 전에 고민했던 부분은

  1. 포켓몬 타입은 type 1, 2로 나뉘어 있다.

  2. type 2는 null 인 경우가 있다. => where 로 제외할 수 있을까?

  3. type 1, 2 을 포함해서 세야 할 것 같다. (총 포켓몬 수보다 합산 값이 클 수 있다)

였거든요.

Group by 에서 type2를 빼면 통합되지 않았다는 오류가 발생해서 어쩔 수 없이 넣긴 했는데, 제가 원한 형태로 구현되지는 않았습니다. 어떻게 해야 null 을 제외한 type2 의 값까지 전부 셀 수 있을까요?

WHERE TYPE2 IS NOT NULL 을 넣게 되면 1개 타입만 가진 개체의 경우 아예 집계를 하지 않는 것 같아서 그 부분도 뺄 수 밖에 없었어요.

최종적으로는 1열에 타입, 2열에 해당하는 개체 수가 나오게 구현하고 싶습니다.

(바위, 불인 포켓몬의 경우 바위에 1개, 불에 1개 계산되도록이요.

바위, 불 포켓몬 + 바위 포켓몬 + 불 포켓몬 = 바위 2개체 불 2개체)

SELECT
  type1,
  type2,
  COUNT(id) as cnt
FROM `basic.pokemon`
GROUP BY 
  type1, type2

답변 1

1

카일스쿨님의 프로필 이미지
카일스쿨
지식공유자

안녕하세요.

 

name type1 type2
리자드 불꽃
리자몽 불꽃 비행

만약 이렇게 데이터가 저장되어 있다고 가정할 때,

데이터를 아래와 같이 수정해야 성배님이 원하시는 방식으로 COUNT가 가능합니다

 

name type_new
리자드 불꽃
리자몽 불꽃
리자몽 비행

 

이렇게 하려면 UNION ALL을 사용해서 할 수 있습니다

WITH base AS (
  SELECT 
    name, 
    type1 AS type_new
  FROM basic.pokemon
  UNION ALL 
  SELECT 
    name, 
    type2 AS type_new
  FROM basic.pokemon
)
SELECT
  *
FROM base

이렇게 하시면 원하는 값을 구할 수 있을거에요.

이후 battle 관련 문제에서 비슷하게 문제를 푼답니다

전성배님의 프로필 이미지
전성배

작성한 질문수

질문하기