MySQL에서 다른 열의 조건이 충족되는 경우 특정 열의 값을 합산하려면 집계 함수 SUM()과 GROUP BY 절을 함께 사용하면 됩니다. GROUP BY를 사용하면 특정 기준(예: 입사 연도와 월)으로 데이터를 그룹화한 뒤, 각 그룹별로 급여 합계를 손쉽게 계산할 수 있습니다.
예제를 통해 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제로 사용할 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> EmployeeName varchar(20),
-> JoiningDate date,
-> Salary int
-> );
Query OK, 0 rows affected (0.54 sec)
직원 이름(EmployeeName), 입사일(JoiningDate), 급여(Salary) 세 개의 열로 구성된 테이블입니다.
2. 데이터 삽입하기
insert 명령을 사용해 테이블에 샘플 레코드를 추가합니다.
mysql> insert into DemoTable values('David','2019-11-02',400);
Query OK, 1 row affected (0.52 sec)
mysql> insert into DemoTable values('Robert','2018-11-25',100);
Query OK, 1 row affected (0.39 sec)
mysql> insert into DemoTable values('Bob','2019-12-14',600);
Query OK, 1 row affected (0.25 sec)
mysql> insert into DemoTable values('Carol','2019-11-03',300);
Query OK, 1 row affected (0.23 sec)3. 전체 데이터 조회하기
select 문으로 테이블의 모든 레코드를 확인해 보겠습니다.
mysql> select * from DemoTable;
위 쿼리는 다음과 같은 결과를 출력합니다.
+--------------+-------------+--------+
| EmployeeName | JoiningDate | Salary |
+--------------+-------------+--------+
| David | 2019-11-02 | 400 |
| Robert | 2018-11-25 | 100 |
| Bob | 2019-12-14 | 600 |
| Carol | 2019-11-03 | 300 |
+--------------+-------------+--------+
4 rows in set (0.00 sec)
4. 조건에 맞는 열 값 합산하기
다른 열(입사 연도, 입사 월)의 조건을 기준으로 급여 열의 값을 합산하는 쿼리는 다음과 같습니다.
mysql> select year(JoiningDate) as JoiningYear,
-> month(JoiningDate) as JoiningMonth,
-> sum(Salary) as Total,
-> group_concat(EmployeeName) as Name
-> from DemoTable
-> group by JoiningYear,JoiningMonth;
실행 결과는 다음과 같습니다.
+-------------+--------------+-------+-------------+
| JoiningYear | JoiningMonth | Total | Name |
+-------------+--------------+-------+-------------+
| 2018 | 11 | 100 | Robert |
| 2019 | 11 | 700 | David,Carol |
| 2019 | 12 | 600 | Bob |
+-------------+--------------+-------+-------------+
3 rows in set (0.04 sec)
쿼리 동작 원리
결과를 자세히 살펴보면 다음과 같이 동작합니다.
- year(), month() 함수: 입사일(JoiningDate)에서 연도와 월을 추출합니다.
- GROUP BY: 추출한 연도와 월을 기준으로 행들을 그룹화합니다.
- sum(Salary): 각 그룹에 속한 직원들의 급여 합계를 계산합니다.
- group_concat(): 같은 그룹에 속한 직원 이름을 쉼표로 구분해 한 줄로 보여줍니다.
예를 들어 2019년 11월에는 David와 Carol이 입사했으며, 두 사람의 급여 합계는 400 + 300 = 700입니다.
응용: 그룹 결과 필터링하기
그룹화된 결과 중 일부만 조회하고 싶다면 HAVING 절을 사용할 수 있습니다. 예를 들어 급여 합계가 500 이상인 그룹만 조회하려면 다음과 같이 작성합니다.
mysql> select year(JoiningDate) as JoiningYear,
-> month(JoiningDate) as JoiningMonth,
-> sum(Salary) as Total
-> from DemoTable
-> group by JoiningYear,JoiningMonth
-> having Total >= 500;
이처럼 SUM()과 GROUP BY를 조합하면 조건에 따라 열 값을 유연하게 집계할 수 있으며, HAVING 절을 추가하면 그룹화된 결과까지 자유롭게 필터링할 수 있습니다.