GROUP BY에 명시하지 않은 열은 다중행 함수 없이 SELECT문에 들어갈 수 없다.

안석우(문과대학 철학)·2025년 2월 18일
0

데이터베이스

목록 보기
6/6

📌 GROUP BY에서 다중행 함수를 사용하지 않은 컬럼을 SELECT에서 사용할 수 없는 이유

SQL에서 GROUP BY를 사용할 때, 집계 함수(다중행 함수)를 사용하지 않은 컬럼은 반드시 GROUP BY 절에 포함해야 한다.
그렇지 않으면 오류가 발생한다.

이 개념을 예제와 함께 쉽게 이해해보자.


🔹 문제 상황

다음과 같은 orders 테이블이 있다고 가정하자.

order_idcustomerproductprice
1AApple100
2ABanana200
3BApple150
4BBanana250
5BApple300

이제 고객별(customer) 총 주문 금액을 구하는 SQL을 작성해보자.

SELECT customer, SUM(price)
FROM orders
GROUP BY customer;

정상 실행 결과

customerSUM(price)
A300
B700

🔹 GROUP BY에 포함되지 않은 컬럼을 사용할 때 발생하는 오류

만약 product 컬럼을 추가해서 다음과 같이 조회하려 하면 어떻게 될까?

SELECT customer, product, SUM(price)
FROM orders
GROUP BY customer;

오류 발생!

ERROR: column "orders.product" must appear in the GROUP BY clause or be used in an aggregate function

❓ 왜 오류가 발생할까?

  • GROUP BY customer를 했기 때문에 각 고객별(customer)로 한 줄의 결과만 반환해야 한다.
  • 그런데 product 컬럼은 그룹화되지 않았으므로, 어떤 값을 출력해야 할지 모호하기 때문이다.

예를 들어, 고객 B의 경우 product 컬럼에는 "Apple""Banana"가 포함되어 있는데, 한 줄로 결과를 만들어야 하므로 어떤 값을 넣어야 할지 알 수 없다.


🔹 해결 방법

이 문제를 해결하는 방법은 크게 두 가지가 있다.

✅ 1) GROUP BY 절에 컬럼을 추가

모든 product별로 그룹을 만들려면 product 컬럼도 GROUP BY에 포함하면 된다.

SELECT customer, product, SUM(price)
FROM orders
GROUP BY customer, product;

🔹 결과

customerproductSUM(price)
AApple100
ABanana200
BApple450
BBanana250

이렇게 하면 고객별 + 상품별로 그룹화되어 각 조합의 합계를 볼 수 있다.


✅ 2) 집계 함수(Aggregate Function) 사용

만약 특정 값을 하나만 선택하고 싶다면 MIN(), MAX(), STRING_AGG() 같은 집계 함수를 사용할 수 있다.

📌 예시 1: 대표적인 상품 하나 선택 (최소값 사용)

SELECT customer, MIN(product), SUM(price)
FROM orders
GROUP BY customer;

🔹 결과

customerMIN(product)SUM(price)
AApple300
BApple700

이 방법은 단순히 알파벳 기준으로 가장 앞에 오는 제품을 선택하는 방식이다.
특정 기준에 따라 제품을 선택하려면 문자열을 묶어서 출력하는 방법을 사용할 수도 있다.

📌 예시 2: 고객이 주문한 모든 상품을 출력

SELECT customer, STRING_AGG(product, ', '), SUM(price)
FROM orders
GROUP BY customer;

🔹 결과

customerSTRING_AGG(product, ', ')SUM(price)
AApple, Banana300
BApple, Banana, Apple700

이렇게 하면 각 고객이 주문한 모든 상품을 쉼표로 구분하여 출력할 수 있다.


🔹 정리

GROUP BY를 사용하면 그룹 단위로 한 줄씩 결과가 반환된다.
GROUP BY에 포함되지 않은 컬럼은 SELECT에서 단독으로 사용할 수 없다.
✔ 해결 방법은

  • GROUP BY 절에 컬럼을 추가하기
  • 집계 함수를 사용하여 대표 값을 선택하기

0개의 댓글