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

MySQL에서 열의 서로 다른 3개 값을 각각 합산해 결과 집합으로 표시하는 쿼리 작성법

하나의 열에 담긴 여러 개의 서로 다른 값을 조건별로 나누어 각각의 합계(또는 개수)를 한 번에 집계하고 싶다면 CASE 문을 활용하면 됩니다. CASE 문은 조건에 따라 다른 값을 반환하므로, SUM 함수와 GROUP BY 절과 함께 사용하면 조건별 집계를 손쉽게 구현할 수 있습니다.

먼저 예제에 사용할 테이블을 생성해 보겠습니다.

mysql> create table DemoTable
(
    ProductName varchar(100),
    ProductRating ENUM('1','2','3')
);
Query OK, 0 rows affected (0.50 sec)

생성한 테이블에 insert 명령으로 샘플 레코드를 삽입합니다.

mysql> insert into DemoTable values('Product-1',3);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('Product-2',1);
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable values('Product-3',2);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('Product-1',2);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('Product-3',3);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('Product-2',2);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('Product-3',3);
Query OK, 1 row affected (0.10 sec)

select 문으로 테이블의 전체 레코드를 확인해 보겠습니다.

mysql> select *from DemoTable;

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

+-------------+---------------+
| ProductName | ProductRating |
+-------------+---------------+
| Product-1   | 3             |
| Product-2   | 1             |
| Product-3   | 2             |
| Product-1   | 2             |
| Product-3   | 3             |
| Product-2   | 2             |
| Product-3   | 3             |
+-------------+---------------+
7 rows in set (0.00 sec)

조건별 합계를 구하는 쿼리

이제 제품 평점(ProductRating)을 기준으로, 평점 1·2·3이 각각 몇 번 등장했는지 제품별로 집계하는 쿼리를 작성해 보겠습니다. 열 안의 서로 다른 3개 값(1, 2, 3)을 각각 합산하여 하나의 결과 집합으로 표시하는 것이 핵심입니다.

mysql> select ProductName,
    sum( case when ProductRating=3 then 1 else 0 end ) as Product_3_Rating,
    sum( case when ProductRating=2 then 1 else 0 end ) as Product_2_Rating,
    sum( case when ProductRating=1 then 1 else 0 end ) as Product_1_Rating
    from DemoTable
    group by ProductName;

위 쿼리의 실행 결과는 다음과 같습니다.

+-------------+------------------+------------------+------------------+
| ProductName | Product_3_Rating | Product_2_Rating | Product_1_Rating |
+-------------+------------------+------------------+------------------+
| Product-1   |                1 |                1 |                0 |
| Product-2   |                0 |                1 |                1 |
| Product-3   |                2 |                1 |                0 |
+-------------+------------------+------------------+------------------+
3 rows in set (0.00 sec)

쿼리 동작 원리

이 쿼리가 어떻게 동작하는지 살펴보겠습니다.

1. CASE 문의 역할: 각 행마다 case when ProductRating=3 then 1 else 0 end와 같은 조건식이 평가됩니다. 해당 조건이 참이면 1을, 거짓이면 0을 반환합니다.

2. SUM 함수의 역할: CASE 문이 반환한 1과 0의 값을 모두 더하면, 결국 해당 조건을 만족하는 행의 개수가 됩니다.

3. GROUP BY의 역할: ProductName을 기준으로 그룹화하기 때문에, 제품별로 평점 1·2·3의 등장 횟수가 각각 별도의 열로 집계됩니다.

결과를 보면 Product-1은 평점 3이 1회, 평점 2가 1회, 평점 1은 0회인 것을 한눈에 확인할 수 있습니다. 이처럼 CASE 문과 SUM, GROUP BY를 조합하면 피벗(pivot) 형태의 조건별 집계 결과를 별도의 복잡한 처리 없이 간단하게 얻을 수 있습니다.