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

MySQL에서 범위별로 GROUP BY를 구현하는 방법

MySQL에서 숫자 데이터를 특정 범위(예: 10 단위)별로 묶어 집계하려면 ROUND 함수UNION을 활용하면 됩니다. 이 글에서는 예제 테이블을 만들고, 값의 크기에 따라 그룹으로 나누어 개수를 세는 방법을 단계별로 살펴보겠습니다.

1. 예제 테이블 생성하기

먼저 범위별로 그룹화할 숫자 값을 저장할 테이블을 생성합니다. 아래 쿼리는 자동 증가되는 Id 컬럼과 정수형 값 컬럼으로 구성된 테이블을 만듭니다.

mysql> create table GroupByRangeDemo
    - > (
    - > Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    - > YourRangeValue int
    - > );
Query OK, 0 rows affected (0.78 sec)

2. 샘플 데이터 삽입하기

테이블이 준비되면 INSERT 문을 사용해 여러 개의 레코드를 삽입합니다. 일부러 작은 값과 큰 값을 섞어서 넣으면 범위별 그룹화 결과를 더 명확하게 확인할 수 있습니다.

mysql> insert into GroupByRangeDemo(YourRangeValue) values(1);
Query OK, 1 row affected (0.14 sec)
mysql> insert into GroupByRangeDemo(YourRangeValue) values(7);
Query OK, 1 row affected (0.15 sec)
mysql> insert into GroupByRangeDemo(YourRangeValue) values(9);
Query OK, 1 row affected (0.14 sec)
mysql> insert into GroupByRangeDemo(YourRangeValue) values(23);
Query OK, 1 row affected (0.13 sec)
mysql> insert into GroupByRangeDemo(YourRangeValue) values(33);
Query OK, 1 row affected (0.15 sec)
mysql> insert into GroupByRangeDemo(YourRangeValue) values(35);
Query OK, 1 row affected (0.16 sec)
mysql> insert into GroupByRangeDemo(YourRangeValue) values(1017);
Query OK, 1 row affected (0.11 sec)

3. 전체 데이터 조회하기

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

mysql> select *from GroupByRangeDemo;

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

+----+----------------+
| Id | YourRangeValue |
+----+----------------+
|  1 |              1 |
|  2 |              7 |
|  3 |              9 |
|  4 |             23 |
|  5 |             33 |
|  6 |             35 |
|  7 |           1017 |
+----+----------------+
7 rows in set (0.04 sec)

4. 범위별 GROUP BY 쿼리 작성하기

이제 핵심인 범위별 그룹화 쿼리입니다. 40 미만의 값은 ROUND(YourRangeValue / 10)로 10 단위 구간별로 나누고, 40 이상인 값은 별도의 '40+' 그룹으로 묶은 뒤 UNION으로 두 결과를 합칩니다.

mysql> select round(YourRangeValue / 10), count(YourRangeValue) from GroupByRangeDemo where YourRangeValue < 40 group by round(YourRangeValue / 10)
   - > union
   - > select '40+', count(YourRangeValue) from GroupByRangeDemo where YourRangeValue >= 40;

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

+----------------------------+-----------------------+
| round(YourRangeValue / 10) | count(YourRangeValue) |
+----------------------------+-----------------------+
| 0                          |                     1 |
| 1                          |                     2 |
| 2                          |                     1 |
| 3                          |                     1 |
| 4                          |                     1 |
| 40+                        |                     1 |
+----------------------------+-----------------------+
6 rows in set (0.08 sec)

쿼리 동작 원리

결과를 해석해 보면 다음과 같습니다.

  • 구간 0: 10 미만의 값(1) → 1개
  • 구간 1: 10~19 사이의 값(7, 9) → 2개
  • 구간 2: 20~29 사이의 값(23) → 1개
  • 구간 3: 30~39 사이의 값(33, 35 중 하나가 아니라 실제로는 33, 35가 각각 계산됨) → 해당 구간 값들
  • 40+: 40 이상의 값(1017) → 1개

즉, ROUND(값 / 10)은 해당 값이 몇 번째 10 단위 구간에 속하는지를 나타내며, 이를 GROUP BY의 기준으로 사용하면 손쉽게 범위별 집계가 가능합니다. 상한선이 없는 마지막 구간은 UNION으로 분리 처리함으로써 '40+'처럼 사람이 읽기 좋은 라벨을 붙일 수 있다는 점이 이 기법의 장점입니다.