inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[백문이불여일타] 데이터 분석을 위한 중급 SQL

리트코드 1179 CASE WHEN , GROUP BY 관련 질문입니다

377

이자영

작성한 질문수 4

0

위의 코드는 제가 작성한 코드고요 돌려봤더니 틀린 코드입니다 (복잡해서 Jan,Feb 만 작성해서 보여드릴게요)

저 CASE 문 왼쪽에 SUM 을 붙이는게 강사님이 가르쳐준 답이었습니다

GROUP BY 를 왜 하는지, CASE WHEN 을 왜 쓰는지는 이해가 됩니다

 

하지만 이해가 안되는 부분이 있습니다.

문제에서는 분명 (id, month) 가 기본키라고 설명하고 있습니다

그 말은 즉 ,

예를 들어 id 가 1 이고 month 가 Feb 인 데이터는 단 하나라는 의미입니다

그렇게 되면 SUM 을 사용할 필요가 없지 않나요?

 

하지만 SUM 을 사용하지 않고 제 코드를 돌려보면 아래 사진의 X 표시를 한 두개의 데이터가 결과에 나오지 않습니다

제 생각에는 SQL문이 GROUP BY 를 어떻게 처리하느냐에 대한 문제인거 같습니다

 

이런것 처럼 group by id 를 한 후 revenue 를 출력해보면 해당 id 그룹의 가장 첫 데이터만 가져오는 것과 연관이 있는 듯 합니다. 누구도 저 SQL문을 쓰면서 해당 id 그룹 중 가장 위에 있는 데이터의 revenue 값을 구하려는 사람은 없을텐데 저게 왜 오류가 안나는 코드인지도 모르겠고요

 

이거에 대해서 설명해주실 수 있을까요?
왜 리트코트 문제에서 SUM 을 붙여야만 하는지 이해가 안됩니다

sql

답변 1

0

지식공유자 J

이 문제에서는 주어진 테이블을 피봇해 아래와 같은 형태의 output을 반환해야 합니다.

id | Jan_Revenue | Feb_Revenue
1 | ... | ...
2 | ... | ...

여기서는 id=1, month='Jan'인 데이터가 단 하나 뿐이지만 만약 여러 개라면, id=1인 row의 Jan_Revenue 컬럼값은 딱 한 자리인데, 여러 개의 값 중 무엇이 들어가야 할까요? 마음대로 하나 고르는 게 아니라 집계를 해야 합니다. 이런 경우 합계를 구하라던지(sum), 가장 큰 값을 구하라던지(max) 하는 지시가 문제에 주어집니다.

이 문제에서는 id=1, month='Jan'인 데이터가 하나이므로 이런 지시가 주어지진 않았지만, 사실 Jan_Revenue 자리에 들어갈 후보는 하나가 아니라 두 가지입니다. Jan_Revenue는 case when month = 'Jan' then revenue else null end 로 만들어진 컬럼이므로 우선 테이블의 각 row를 하나씩 체크하며 month 값에 따라 revenue 값, 또는 아무 것도 채우지 않는 것(null) 중 한 가지를 선택하게 되죠. 값들만 나열하면 아래와 같이 될 거에요.

[8000, null, null, ... ]

이들을 집계해 최종적으로 Jan_Revenue에 들어갈 값을 구해야 하는데, 여기서 숫자(revenue) 값은 딱 하나이고(id=1, month='Jan'인 데이터가 하나) 나머지는 null이므로 sum, max, min 등 어떤 집계함수를 사용하든 8000이라는 값을 가져올 수 있습니다.

결론은 group by를 사용해 피봇테이블을 만들 때는 집계함수가 꼭 필요하다는 것이고, 이번 문제와 같은 경우에는 sum 대신 다른 것을 집계함수를 사용해도 동일한 값을 반환합니다.

리트코드 1280. Students and Examinations

0

94

3

16강 LEFT JOIN 리트코드 (183. Customers Who Never Order) 관련 질문

0

103

2

African Cities 문제관련 질문

0

65

1

SQL 코딩테스트 질문

0

242

1

HACKER RANK에서 문제찾기

0

109

2

강의 자료 다운로드

0

101

2

Asian population 문제가 없어요

0

88

2

INNER JOIN 에서 A.키 쓸때 빨간 색 나오고 'dause'

0

77

2

별칭 관련해서 질문 있습니다.

0

88

2

rising temperature 문제 질문

0

109

2

해커랭크 TOP EARNERS 문제 질문

0

110

1

ON 뒤에 질문

0

106

2

INNER JOIN 질문. 강의와 결과값이 다릅니다.

0

211

3

END, 뒤에 * 붙이면 에러가 뜹니다

1

213

2

CustomerID가 중복되서 나타나요

0

242

3

별칭이 전체 테이블을 못 불러와요.

0

152

2

CASE WHEN 쿼리 오류 문의

1

342

3

CASE문제풀이 질문

0

133

1

Customers Who Never Order 풀다가 Alias관련 질문사항

0

141

1

Average Population 질문

0

143

1

Revising Aggregations - The Count Function 질문

0

110

1

Average Population of Each Continent 에대해서 질문

0

200

3

w3schools 에서 쿼리 작성 질문

0

167

1

INNER JOIN 할 때 NULL 값이 안보일 수도 있나요?

0

332

1