Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 열을 곱한 후 고객 이름처럼 유사한 레코드를 가진 행을 합산하는 방법

열을 곱한 후 고객 이름별로 행을 합산하는 방법

이 글에서는 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만 지정하면 충분합니다.