2013-01-08 11 views
2

mysql에 SUM() 함수과 함께 의심의 여지가 있습니다. 조건없이 SUM() 함수를 사용할 때 잘 작동합니다. 하지만 조건과 SUM() 함수를 사용하면 조건과 일치하는 레코드 수가 반환됩니다. 설명해주세요.mysql sum function issue

다음과 같이 네 개의 열이있는 한 명의 교사가 만들었습니다.

mysql> desc Teacher; 


+--------------+-------------+------+-----+-------------------+ 
| Field  | Type  | Null | Key | Default   | 
+--------------+-------------+------+-----+-------------------+ 
| TeacherId | varchar(36) | NO | PRI | NULL    | 
| FirstName | varchar(50) | NO |  | NULL    | 
| LastName  | varchar(50) | NO |  | NULL    | 
| SyncStatus | int(11)  | NO |  | NULL    | 
+--------------+-------------+------+-----+-------------------+ 

다음 기록에 포함되어 있습니다.

mysql> select * from Teacher; 

+-----------+-----------+-----------+------------+ 
| TeacherId | FirstName | LastName | SyncStatus | 
+-----------+-----------+-----------+------------+ 
| 001  | Sagar  | Kapadia |   1 | 
| 002  | Vishal | Chaudhari |   1 | 
| 003  | Milan  | Panchal |   1 | 
| 004  | Jugal  | Desai  |   1 | 
| 005  | Baburao | Apte  |   1 | 
| 006  | Jaya  | Bacchan |   0 | 
| 007  | Jaya  | Bacchan |   2 | 
| 008  | Jaya  | Bacchan |   2 | 
+-----------+-----------+-----------+------------+ 
8 rows in set (0.00 sec) 




mysql> select TeacherId,FirstName,LastName,Concat(FirstName,' ',LastName) as FullName,SUM(SyncStatus) from Teacher having FullName like '_____ %'; 
+-----------+-----------+----------+---------------+-----------------+ 
| TeacherId | FIrstName | LastName | FullName  | sum(SyncStatus) | 
+-----------+-----------+----------+---------------+-----------------+ 
| 001  | Sagar  | Kapadia | Sagar Kapadia |    9 | 
+-----------+-----------+----------+---------------+-----------------+ 
1 row in set (0.00 sec) 

는 그래서 동기화 상태 나에게 완벽한 합을 반환합니다. 하지만 조건과 SUM()을 사용하면 레코드 수를 returen.

mysql> select TeacherId,FIrstName,LastName,Concat(FirstName,' ',LastName) as FullName,sum(SyncStatus = 0) from Teacher having FullName like '_____ %'; 
+-----------+-----------+----------+---------------+---------------------+ 
| TeacherId | FIrstName | LastName | FullName  | sum(SyncStatus = 0) | 
+-----------+-----------+----------+---------------+---------------------+ 
| 001  | Sagar  | Kapadia | Sagar Kapadia |     1 | 
+-----------+-----------+----------+---------------+---------------------+ 
1 row in set (0.00 sec) 



mysql> select TeacherId,FIrstName,LastName,Concat(FirstName,' ',LastName) as FullName,sum(SyncStatus = 1) from Teacher having FullName like '_____ %'; 
+-----------+-----------+----------+---------------+---------------------+ 
| TeacherId | FIrstName | LastName | FullName  | sum(SyncStatus = 1) | 
+-----------+-----------+----------+---------------+---------------------+ 
| 001  | Sagar  | Kapadia | Sagar Kapadia |     5 | 
+-----------+-----------+----------+---------------+---------------------+ 
1 row in set (0.00 sec) 



mysql> select TeacherId,FIrstName,LastName,Concat(FirstName,' ',LastName) as FullName,sum(SyncStatus = 2) from Teacher having FullName like '_____ %'; 
+-----------+-----------+----------+---------------+---------------------+ 
| TeacherId | FIrstName | LastName | FullName  | sum(SyncStatus = 2) | 
+-----------+-----------+----------+---------------+---------------------+ 
| 001  | Sagar  | Kapadia | Sagar Kapadia |     2 | 
+-----------+-----------+----------+---------------+---------------------+ 
1 row in set (0.00 sec) 

답변

3

당신 말이 맞습니다. 그게 SyncStatus equals 2 경우 테스트 할 각 행 SyncStatus = 2에서

을 실행하는 방법이며, 1(true) or 0(false) 반환하기 때문에 당신은 기본적으로 진리 값의 합을 받고 있으므로이 기능 sum(SyncStatus = 2)은 행의 수를 반환합니다 (1)

+0

@Ankur에게 감사합니다. 이제 SUM() 함수가 어떻게 실행되는지 이해했습니다. 다시 한 번 당신 덕분에 .... – milanpanchal

+0

그냥이 정확한 종류의 일을 만났습니다. 내가 원했던 것처럼 보였습니다 (액션이 한 달에 완료된 횟수를 반환하는 것은'SUM (확인 됨 = 1))'와'GROUP BY'를 사용하여). 그러나 이것이 내가 * 할 일이라고 생각하는지 확신 할 수 없었습니다. * 지금 알고 있습니다. :) – CD001