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

MySQL에서 조건에 따라 값을 계산하고 결과를 별도의 열로 표시하는 방법

MySQL에서 조건별 값 계산하기

MySQL에서는 CASE 표현식SUM() 집계 함수를 함께 사용하면 특정 조건을 만족하는 행의 개수를 계산하고, 그 결과를 각각 다른 열로 표시할 수 있습니다. 이 기법은 과목별 수강 인원처럼 데이터를 그룹 단위로 요약하는 피벗 형태의 보고서를 만들 때 특히 유용합니다.

1단계: 테이블 생성

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

mysql> create table DemoTable1485
-> (
-> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentName varchar(20),
-> StudentSubject varchar(20)
-> );
Query OK, 0 rows affected (0.72 sec)

2단계: 데이터 삽입

INSERT 명령을 사용해 테이블에 샘플 레코드를 추가합니다.

mysql> insert into DemoTable1485(StudentName,StudentSubject) values('Chris','MySQL');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1485(StudentName,StudentSubject) values('Robert','MongoDB');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable1485(StudentName,StudentSubject) values('Robert','MongoDB');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable1485(StudentName,StudentSubject) values('Chris','Java');
Query OK, 1 row affected (0.12 sec)

3단계: 전체 데이터 조회

SELECT 문으로 테이블에 저장된 모든 레코드를 확인합니다.

mysql> select * from DemoTable1485;

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

+-----------+-------------+----------------+
| StudentId | StudentName | StudentSubject |
+-----------+-------------+----------------+
| 1 | Chris | MySQL |
| 2 | Robert | MongoDB |
| 3 | Robert | MongoDB |
| 4 | Chris | Java |
+-----------+-------------+----------------+
4 rows in set (0.00 sec)

4단계: 조건에 따라 값 계산하기

아래 쿼리는 CASE 표현식으로 조건을 판별하고 SUM()으로 개수를 집계한 뒤, GROUP BY로 과목별로 묶어 학생 이름별 카운트를 별도의 열로 출력합니다.

mysql> select StudentSubject,
-> sum(case when StudentName = 'Chris' THEN 1 ELSE 0 END) Chris_Count,
-> sum(case when StudentName = 'Robert' THEN 1 ELSE 0 END) Robert_Count
-> from DemoTable1485
-> group by StudentSubject;

위 쿼리를 실행하면 다음과 같은 결과가 나타납니다.

+----------------+-------------+--------------+
| StudentSubject | Chris_Count | Robert_Count |
+----------------+-------------+--------------+
| MySQL | 1 | 0 |
| MongoDB | 0 | 2 |
| Java | 1 | 0 |
+----------------+-------------+--------------+
3 rows in set (0.00 sec)

쿼리 동작 원리

case when StudentName = 'Chris' THEN 1 ELSE 0 END 구문은 해당 행의 학생 이름이 'Chris'이면 1, 아니면 0을 반환합니다. 이 값을 SUM()으로 합산하면 과목별로 Chris가 등장한 횟수가 계산됩니다. 같은 방식으로 Robert에 대한 카운트도 별도의 열로 구할 수 있으며, GROUP BY StudentSubject 덕분에 결과가 과목 단위로 깔끔하게 정리됩니다.

이 패턴은 COUNT(CASE WHEN ...) 또는 SUM(IF(...)) 형태로도 응용할 수 있습니다. 조건을 더 추가하고 싶다면 CASE 절을 필요한 만큼 나열하기만 하면 됩니다.