inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

총 정리 문제 풀이 4~5번

총 정리 문제 풀이 2번 방출 여부 상관

해결된 질문

146

아경

작성한 질문수 4

0

안녕하세요. 선생님, 2번 문제에 질문있습니다.

2. 각 포켓몬 타입1을 기준으로 가장 많이 포획된(방출 여부 상관없음) 포켓몬의 타입1, 포켓몬의 이름과 포획 횟수를 출력해주세요.

위 문제에서 만약에 방출 여부를 판단하고 풀어본다면 어떻게 나오는지 궁금해서 풀이를 해보았습니다. 아래 쿼리대로 풀면 될까요?

WITH result AS (
  SELECT
    pokemon_id,
    status,
    SUM(CASE
    WHEN status IN('Active', 'Training')  THEN 1
    ELSE 0
    END) AS status_pokemon_cnt
  FROM basic.trainer_pokemon
  GROUP BY
    pokemon_id,
    status
  ORDER BY
    status_pokemon_cnt DESC
)
SELECT
  type1,
  kor_name,
  status_pokemon_cnt
FROM result
LEFT JOIN basic.pokemon AS p
ON result.pokemon_id = p.id
LIMIT 1

sql bigquery 데이터-리터러시

답변 2

0

아경

감사합니다. 선생님, 저의 원래 질문 의도는 방출되지 않은(status IN("Active", "Training") 포켓몬의 type1, kor_name, 포켓몬의 수를 구하고 싶었습니다!

선생님 말씀대로라면 아래 쿼리처럼 하면 될까요??

WITH results_release_pokemon AS (
  SELECT
  p.type1,
  tp.status,
  p.kor_name,
  COUNT(tp.id) AS cnt,
  CASE WHEN status IN("Active", "Training") THEN "no_released"
  ELSE "released"
  END AS result_release_pokemon
FROM basic.trainer_pokemon AS tp
LEFT JOIN basic.pokemon as p
ON tp.pokemon_id = p.id
GROUP BY
  p.type1,
  tp.status,
  p.kor_name
ORDER BY
  cnt DESC
)
SELECT
  type1,
  kor_name,
  cnt
FROM results_release_pokemon AS rrp
WHERE
  result_release_pokemon = "no_released"

0

카일스쿨

그렇다면 저는 WHERE 조건에 넣을 것 같아요!. tp.status가 컬럼으로 따로 빠질 필요가 없다면..!

 

SELECT
  p.type1,
  p.kor_name,
  COUNT(tp.id) AS cnt
FROM basic.trainer_pokemon AS tp
LEFT JOIN basic.pokemon as p
ON tp.pokemon_id = p.id
WHERE tp.status IN ("Active", "Training")
GROUP BY
  p.type1,
  p.kor_name
ORDER BY
  cnt DESC

 

0

아경

아 제가 너무 복잡하게 생각했네요 !!! 감사합니다 ㅎㅎㅎ

0

카일스쿨

안녕하세요. 열심히 학습하고 계시네요!

 

말씀해주신 내용이 관점에 따라서 여러가지로 생각할 수 있을 것 같아요. 방출 여부를 신경쓴다는 것이 방출 여부에 따른 포켓몬 타입 1, 포켓몬 이름을 출력하고 싶다고 하는 것일까요? 혹은 trainer_pokemon의 status 여부도 같이 보고 싶다는 것일까요?

 

쿼리를 작성하기 전에 내가 추출하려는 것의 문장을 구체화를 하면, 문제를 해결할 때 더 도움이 됩니다.

 

train_pokemon의 status를 추가한다고 하면 저라면 간단하게 뽑을 것 같네요

 

SELECT
  p.type1,
  tp.status,
  p.kor_name,
  COUNT(tp.id) AS cnt
FROM basic.trainer_pokemon AS tp
LEFT JOIN basic.pokemon as p
ON tp.pokemon_id = p.id
GROUP BY
  p.type1,
  tp.status,
  p.kor_name
ORDER BY
  cnt DESC

 

여기서 tp.status가 Training, Active인 것과 아닌 것을 나누고 싶다면 CASE WHEN을 쓸 것 같네요. SUM을 쓰는 것도 방법인데 저라면 CASE WHEN으로 분류하고 나중에 집계하는 것을 선호해요(trainer_pokemon의 status에 들어갈 값이 겹치지 않을 것이라 지금 해주신대로 하셔도 괜찮긴 합니다)

 

추가적으로 status, 타입1, 이름 별로 1마리만 뽑고 싶을 때는 윈도우 함수를 사용해야 하는데 이 부분은 초급 레벨에선 좀 어렵다고 판단해서 BigQuery 활용편 강의에 설명했어요. 윈도우 함수를 사용하면 각 요소 별로 Row가 1개씩 나오도록 할 수 있어요

vs code

0

48

2

수업자료 다운

0

46

2

쿼리 화면 문의

0

70

2

4-5. 3번 문제 질

0

64

2

JOIN 1번 문제

1

73

2

battle 테이블 생성 시 생성 오류

0

68

1

5-6. 4번 문제 WHERE 조건의 위치 문의

0

64

2

5-6. 연습문제 4번, type2에 대해서는 고려하지 않아도 될까요?

1

68

2

battle table 오류

0

68

2

location IS NOT NULL 을 굳이 안 써도 되지 않나요?

0

61

2

12강 집계 함수

0

48

1

2-6. 연습 문제 1~3번

0

49

1

안녕하세요! 11번 문제 query문에 관해 질문드립니다

0

49

1

2-6 #2 WHERE vs. HAVING절 사용 여부 차이

0

65

1

섹션 별 퀴즈

0

64

1

espanso 설치 완료 후 프로그램 실행 문제

0

102

2

Syntax에러

0

81

2

4-5. 1번 문제 TIMESTAMP 관련 질문

0

87

2

시각화 도구 사용

0

109

2

11번 문제 GROUP BY 사용하는 이유

0

98

1

big query 쿼리 결과 컬럼 폭

0

107

3

battle 스키마 조건 복사 파일이 열리지 않아요.

0

128

1

6-5 데이터 검증 결과 예시문제

0

78

2

battle 스키마 조건 복사붙여넣기용 자료

0

113

2