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

박서현님의 프로필 이미지

작성한 질문수

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

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

2-5 where과 having 예시 쿼리문에 대한 질문

해결된 질문

24.07.30 08:55 작성

·

114

·

수정됨

0

pdf파일 158페이지, 159페이지에 있는 where과 having 쿼리 예시문을 보다가 궁금한 게 생겨서요.

  • where 쿼리문 : select 컬럼 1, 컬럼2라고 돼 있는데 group by 컬럼1, 컬럼2 라고 하지 않아도 실행이 가능한가요?

  • having 쿼리문 : group by하는(그룹화 기준) 컬럼과 count 컬럼이 같을 수도 있나요? count (컬럼3)이어야 하지 않는지 궁금합니다!

답변 3

1

박서현님의 프로필 이미지
박서현
질문자

2024. 08. 01. 08:07

아 이제 확실히 이해 됐어요!! 샘플 데이터로 쿼리까지 만들어주시고 감사합니다ㅠㅠ

1

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

2024. 07. 30. 09:43

서현님 안녕하세요! 잘 학습하고 계시네요!

  • 말씀하신 것처럼 where 쿼리 문에서는 GROUP BY가 있어야 실행이 가능합니다. 강의에서는 WHERE과 HAVING을 비교드리기 위해 사용했는데, WHERE 설명을 할 때 GROUP BY가 있으면 헷갈릴 수 있어 제외했는데 이 부분은 수정을 하거나 들 ㄴ예시를 쓰는게 좋을수도 있겠네요. 전해드리고 싶었던 핵심은 FROM에서 바로 조건을 건다!입니다

  • HAVING의 경우 그룹화 기준 컬럼과 COUNT 컬럼을 사용할 수 있습니다.

    • col1, col2, 그리고 col1의 ROW를 count하겠다!라는 의미가 되어요

    • 아래 샘플 데이터를 만들었어요. 실행해보시면 실행이 되어요

WITH sample_data AS (
    SELECT 'A' AS col1, 'X' AS col2, 1 AS col3 UNION ALL
    SELECT 'A', 'X', 2 UNION ALL
    SELECT 'A', 'X', 3 UNION ALL
    SELECT 'A', 'Y', 4 UNION ALL
    SELECT 'B', 'X', 5 UNION ALL
    SELECT 'B', 'X', 6 UNION ALL
    SELECT 'B', 'Y', 7 UNION ALL
    SELECT 'B', 'Y', 8 UNION ALL
    SELECT 'B', 'Y', 9 UNION ALL
    SELECT 'C', 'Z', 10
)
SELECT
    col1, 
    col2,
    COUNT(col1) AS col1_count
FROM sample_data
GROUP BY col1, col2
HAVING COUNT(col1) > 3;

 

 

또 궁금한 내용이 있으시면 말씀해주세요! 감사합니다

0

박서현님의 프로필 이미지
박서현
질문자

2024. 07. 31. 08:09

정성스럽고 빠른 답변 감사드려요!

2번째 having에서의 질문은 group by의 컬럼과 count()안에 있는 컬럼이 같을 수 있는지에 대한 질문이었어요!

‘특정 컬럼 기준으로 모으면서 다른 컬럼에서 집계 가능’하다고 배웠던 것 같은데, 그룹화 기준 컬럼과 집계하는 컬럼이 같을 수도 있는 건지 궁금해서 다시 여쭤봅니다!

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

2024. 07. 31. 08:31

네 예시로 드린 것처럼 group by의 컬럼과 count() 안에 컬럼이 같을 수 있고, 실행이 되어요.

실행에는 문제가 없으나, 특정 집계 함수에선 집계를 해도 의미없는 결과가 나올수도 있지요

 

WITH sample_data AS (
    SELECT 'A' AS col1, 'X' AS col2, 1 AS col3 UNION ALL
    SELECT 'A', 'X', 2 UNION ALL
    SELECT 'A', 'X', 3 UNION ALL
    SELECT 'A', 'Y', 4 UNION ALL
    SELECT 'B', 'X', 5 UNION ALL
    SELECT 'B', 'X', 6 UNION ALL
    SELECT 'B', 'Y', 7 UNION ALL
    SELECT 'B', 'Y', 8 UNION ALL
    SELECT 'B', 'Y', 9 UNION ALL
    SELECT 'C', 'Z', 10
)
SELECT
    col1, 
    col3,
    SUM(col3) AS col3_sum
FROM sample_data
GROUP BY col1, col3

 

위 쿼리도 정상적으로 실행이 됩니다

결과는 다음과 같이 나옵니다

col1	col3	col3_sum
A	1	1
A	2	2
A	3	3
A	4	4
B	5	5
B	6	6
B	7	7
B	8	8
B	9	9
C	10	10

 

결과가 나오지만, col3과 SUM(col3)이 결과가 동일해서 목적에 따라서는 애매할 수도 있지요. 그러나 제가 최초에 알려드린 COUNT를 사용한 쿼리는 세는 것이라서 괜찮습니다.

WITH sample_data AS (
    SELECT 'A' AS col1, 'X' AS col2, 1 AS col3 UNION ALL
    SELECT 'A', 'X', 2 UNION ALL
    SELECT 'A', 'X', 3 UNION ALL
    SELECT 'A', 'Y', 4 UNION ALL
    SELECT 'B', 'X', 5 UNION ALL
    SELECT 'B', 'X', 6 UNION ALL
    SELECT 'B', 'Y', 7 UNION ALL
    SELECT 'B', 'Y', 8 UNION ALL
    SELECT 'B', 'Y', 9 UNION ALL
    SELECT 'C', 'Z', 10
)
SELECT
    col1, 
    col3,
    COUNT(col3) AS col3_count
FROM sample_data
GROUP BY col1, col3

 

col1	col3	col3_count
A	1	1
A	2	1
A	3	1
A	4	1
B	5	1
B	6	1
B	7	1
B	8	1
B	9	1
C	10	1

 

결론적으로 말씀드리면, 다른 컬럼에서 집계 가능이라고 말씀드렸지만 동일한 컬럼을 사용할 수 있습니다.

 

보통은 다른 컬럼을 집계하는 경우가 많지만, COUNT 같은 경우엔 같은 컬럼을 사용하기도 합니다. WHERE, HAVING 비교 예시에선 큰 의미를 두지 않고 col1을 사용했어요. HAVING 파트에서 핵심은 HAVING은 GROUP BY를 한 후에 생기는 컬럼에 조건을 설정한다입니다. 이 부분 위주로 보시면 될 것 같아요