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

MySQL에서 여러 열을 GROUP BY로 그룹화하는 방법

MySQL에서 IF() 함수를 활용하면 여러 열을 기준으로 GROUP BY를 수행할 수 있습니다. 개념을 쉽게 이해할 수 있도록 먼저 예제용 테이블을 만들어 보겠습니다.

테이블 생성하기

다음 쿼리로 테이블을 생성합니다.

mysql> create table MultipleGroupByDemo
    -> (
    -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> CustomerId int,
    -> ProductName varchar(100)
    -> );
Query OK, 0 rows affected (0.59 sec)

샘플 데이터 삽입하기

INSERT 명령을 사용해 몇 개의 레코드를 추가합니다.

mysql> insert into MultipleGroupByDemo(CustomerId,ProductName) values(1000,'Product-1');
Query OK, 1 row affected (0.20 sec)
mysql> insert into MultipleGroupByDemo(CustomerId,ProductName) values(1001,'Product-2');
Query OK, 1 row affected (0.18 sec)
mysql> insert into MultipleGroupByDemo(CustomerId,ProductName) values(1001,'Product-2');
Query OK, 1 row affected (0.16 sec)
mysql> insert into MultipleGroupByDemo(CustomerId,ProductName) values(1001,'Product-2');
Query OK, 1 row affected (0.12 sec)
mysql> insert into MultipleGroupByDemo(CustomerId,ProductName) values(1002,'Product-3');
Query OK, 1 row affected (0.09 sec)
mysql> insert into MultipleGroupByDemo(CustomerId,ProductName) values(1002,'Product-3');
Query OK, 1 row affected (0.15 sec)
mysql> insert into MultipleGroupByDemo(CustomerId,ProductName) values(1003,'Product-4');
Query OK, 1 row affected (0.16 sec)

저장된 전체 레코드 확인하기

SELECT 문으로 테이블의 모든 레코드를 조회합니다.

mysql> select *from MultipleGroupByDemo;

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

+----+------------+-------------+
| Id | CustomerId | ProductName |
+----+------------+-------------+
|  1 |      1000 | Product-1  |
|  2 |      1001 | Product-2  |
|  3 |      1001 | Product-2  |
|  4 |      1001 | Product-2  |
|  5 |      1002 | Product-3  |
|  6 |      1002 | Product-3  |
|  7 |      1003 | Product-4  |
+----+------------+-------------+
7 rows in set (0.00 sec)

여러 열을 GROUP BY 하는 쿼리

여러 열을 기준으로 그룹화하려면 아래와 같이 IF() 함수를 함께 사용합니다.

mysql> SELECT CustomerId, if( ProductName = 'Product-2', 1, 0 )
    -> FROM MultipleGroupByDemo
    -> GROUP BY ProductName , CustomerId;

위 쿼리의 실행 결과입니다.

+------------+---------------------------------------+
| CustomerId | if( ProductName = 'Product-2', 1, 0 ) |
+------------+---------------------------------------+
|      1000 |                        0 |
|      1001 |                        1 |
|      1002 |                        0 |
|      1003 |                        0 |
+------------+---------------------------------------+
4 rows in set (0.00 sec)

대체 쿼리: MAX() 함수 활용

같은 결과를 얻는 또 다른 방법으로, MAX() 함수와 IF()를 조합해 고객 ID별로 그룹화할 수 있습니다.

mysql> select CustomerId,MAX(IF(ProductName = 'Product-2', 1,0)) from MultipleGroupByDemo group by CustomerId;

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

+------------+-----------------------------------------+
| CustomerId | MAX(IF(ProductName = 'Product-2', 1,0)) |
+------------+-----------------------------------------+
|       1000 |                                       0 |
|       1001 |                                       1 |
|       1002 |                                       0 |
|       1003 |                                       0 |
+------------+-----------------------------------------+
4 rows in set (0.00 sec)

첫 번째 쿼리는 ProductName과 CustomerId 두 열을 모두 기준으로 그룹화한 결과를 보여주며, 두 번째 쿼리는 고객 ID별로 해당 고객이 'Product-2'를 구매했는지 여부(1 또는 0)를 집계합니다. 이처럼 IF() 함수를 GROUP BY와 함께 사용하면 조건에 따른 플래그 값을 손쉽게 계산할 수 있습니다.