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

MySQL에서 열의 양수 값과 음수 값 합계를 별도의 열로 표시하는 방법

MySQL에서 하나의 열에 저장된 데이터 중 양수 값과 음수 값을 각각 분리하여 합계를 구하고 싶은 경우가 있습니다. 이럴 때 CASE 문을 활용하면 간단하게 해결할 수 있습니다. 이 글에서는 예제를 통해 그 방법을 단계별로 살펴보겠습니다.

1. 예제 테이블 생성하기

먼저 실습에 사용할 테이블을 생성합니다.

mysql> create table DemoTable(
    Id int,
    Value int
);
Query OK, 0 rows affected (0.51 sec)

2. 샘플 데이터 삽입하기

insert 명령을 사용하여 양수와 음수가 섞인 레코드들을 테이블에 삽입합니다.

mysql> insert into DemoTable values(10,100);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values(10,-110);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values(10,200);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values(10,-678);
Query OK, 1 row affected (0.17 sec)

3. 전체 데이터 확인하기

select 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.

mysql> select *from DemoTable;

실행 결과는 다음과 같습니다.

+------+-------+
| Id   | Value |
+------+-------+
|   10 |   100 |
|   10 |  -110 |
|   10 |   200 |
|   10 |  -678 |
+------+-------+
4 rows in set (0.00 sec)

4. CASE 문으로 양수·음수 합계 구하기

핵심은 CASE 문입니다. 조건식에서 값이 0보다 크면 양수 합계에, 0보다 작으면 음수 합계에 포함시키고, 해당하지 않는 경우에는 0을 반환하도록 처리합니다. 이후 GROUP BY로 Id별로 묶어주면 원하는 결과를 얻을 수 있습니다.

mysql> select Id,
    sum(case when Value>0 then Value else 0 end) as Positive_Value,
    sum(case when Value<0 then Value else 0 end) as Negative_Value
    from DemoTable
    group by Id;

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

+------+----------------+----------------+
| Id   | Positive_Value | Negative_Value |
+------+----------------+----------------+
|   10 |            300 |           -788 |
+------+----------------+----------------+
1 row in set (0.00 sec)

쿼리 동작 원리 정리

  • sum(case when Value>0 then Value else 0 end): 값이 양수일 때만 더하고, 음수나 0인 경우에는 0을 더해 양수 합계를 계산합니다.
  • sum(case when Value<0 then Value else 0 end): 값이 음수일 때만 더하고, 나머지는 0을 더해 음수 합계를 계산합니다.
  • group by Id: Id 기준으로 그룹화하여 각 그룹별 합계를 산출합니다.

예제에서는 양수 값 100 + 200 = 300, 음수 값 -110 + (-678) = -788로 각각 별도의 열에 표시된 것을 확인할 수 있습니다. 이처럼 CASE 문과 집계 함수를 조합하면 조건부 합계를 손쉽게 구현할 수 있으며, 회계 데이터 분석이나 입출금 내역 집계 등 다양한 실무 상황에서 유용하게 활용됩니다.