열을 곱한 후 고객 이름별로 행을 합산하는 방법
이 글에서는 MySQL에서 두 열의 값을 서로 곱한 뒤, 고객 이름처럼 동일한 값을 가진 행들을 그룹으로 묶어 합산하는 방법을 단계별로 살펴봅니다. 이해를 돕기 위해 CustomerId(고객 ID), CustomerName(고객 이름), CustomerItems(아이템 수량), CustomerPrice(가격) 네 개의 필드로 구성된 테이블을 만들어 실습해 보겠습니다.
전체 작업 흐름은 다음과 같습니다.
- 먼저 아이템 수량(CustomerItems)과 가격(CustomerPrice)을 곱합니다.
- 그다음 GROUP BY 절로 고객 이름이 같은 행들을 하나의 그룹으로 묶습니다.
- 마지막으로 SUM() 함수를 사용해 각 고객별 총합을 계산합니다.
1단계: 테이블 생성
먼저 실습에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
(
CustomerId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
CustomerName varchar(100),
CustomerItems int,
CustomerPrice int
);
Query OK, 0 rows affected (0.54 sec)2단계: 샘플 데이터 삽입
insert 명령을 사용해 테이블에 샘플 레코드를 삽입합니다. 여기서는 'Larry'와 'Mike' 두 고객의 구매 내역을 여러 건씩 등록했습니다.
mysql> insert into DemoTable(CustomerName,CustomerItems,CustomerPrice)values('Larry',3,450);
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable(CustomerName,CustomerItems,CustomerPrice)values('Mike',2,550);
Query OK, 1 row affected (0.42 sec)
mysql> insert into DemoTable(CustomerName,CustomerItems,CustomerPrice)values('Larry',4,1000);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(CustomerName,CustomerItems,CustomerPrice)values('Larry',1,100);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(CustomerName,CustomerItems,CustomerPrice)values('Mike',5,200);
Query OK, 1 row affected (0.71 sec)3단계: 저장된 레코드 확인
select 명령으로 테이블에 저장된 전체 레코드를 조회합니다.
mysql> select *from DemoTable;
위 쿼리는 다음과 같은 결과를 출력합니다.
+------------+--------------+---------------+---------------+ | CustomerId | CustomerName | CustomerItems | CustomerPrice | +------------+--------------+---------------+---------------+ | 1 | Larry | 3 | 450 | | 2 | Mike | 2 | 550 | | 3 | Larry | 4 | 1000 | | 4 | Larry | 1 | 100 | | 5 | Mike | 5 | 200 | +------------+--------------+---------------+---------------+ 5 rows in set (0.00 sec)
4단계: 열을 곱한 후 유사한 레코드별로 행 합산하기
다음은 수량과 가격을 곱한 값(CustomerItems * CustomerPrice)을 고객 이름별로 합산하는 핵심 쿼리입니다.
mysql> SELECT CustomerName, SUM( CustomerItems* CustomerPrice) AS TOTAL_PRICE FROM DemoTable GROUP BY CustomerName;
실행 결과는 다음과 같습니다.
+--------------+-------------+ | CustomerName | TOTAL_PRICE | +--------------+-------------+ | Larry | 5450 | | Mike | 2100 | +--------------+-------------+ 2 rows in set (0.05 sec)
쿼리 동작 원리
결과를 직접 검증해 보면 쿼리가 어떻게 동작하는지 쉽게 이해할 수 있습니다.
- Larry: (3 × 450) + (4 × 1000) + (1 × 100) = 1350 + 4000 + 100 = 5450
- Mike: (2 × 550) + (5 × 200) = 1100 + 1000 = 2100
즉, SUM() 함수 안에서 각 행의 수량과 가격이 먼저 곱해지고, GROUP BY CustomerName에 의해 같은 고객 이름을 가진 행들이 하나의 그룹으로 묶인 뒤 그룹별로 합산됩니다. AS TOTAL_PRICE는 계산 결과 열에 붙인 별칭(alias)으로, 출력 결과를 더 읽기 쉽게 만들어 줍니다.
참고 사항
MySQL 5.7 이상 버전에서는 ONLY_FULL_GROUP_BY SQL 모드가 기본적으로 활성화되어 있습니다. 따라서 SELECT 절에 집계 함수를 적용하지 않은 열이 있다면 반드시 GROUP BY 절에 함께 포함해야 오류 없이 실행됩니다. 위 예제에서는 CustomerName 하나만 조회하므로 GROUP BY CustomerName만 지정하면 충분합니다.