2013-10-07 2 views
2

나는 다음 필드로 간단한 MySQL의 DB를 가지고 :어떻게 고유 값의 수를 표시하고 0을 포함 할 수 있습니까?

mysql> SELECT * from table; 
+----+-----------+------+ 
| id | location | name | 
+----+-----------+------+ 
| 1 | NJ  | Gary | 
| 2 | MN  | Paul | 
| 3 | AZ  |  | 
| 4 | MI  | Adam | 
| 5 | NJ  |  | 
| 6 | MN  | Dave | 
+----+-----------+------+ 
6 rows in set (0.00 sec) 

나는 사람들이 이름이없는 사람을 제외하고, 각각의 상태에서 얼마나 많은 목록을 검색 할 필요가있다.

+----------+-------+ 
| location | count | 
+----------+-------+ 
| AZ  |  0 | 
| MI  |  1 | 
| MN  |  2 | 
| NJ  |  1 | 
+----------+-------+ 

내가

SELECT location, COUNT(*) AS count FROM table WHERE name!='' GROUP BY location; 

그러나, COUNT (*)는 제로 카운트를 제외과 가까이 할 수있어 : 즉, 나는 다음과 같은 결과를 재현하기 위해 노력하고있어. 나는

SELECT DISTINCT location, null as count from table; 

에 의해 생성 된 테이블 만 가입 오른쪽 테이블에서 카운트 열을 밖으로 던져 LEFT과 함께 조인을 사용하려고 시도하고, 오른쪽은 제로 행 또는 실제 계산에 포함하지 않는 것 JOIN 몇몇 이유.

마치 내가 갖고 있지 않은 MySQL 명령이나 간단한 것이 있다고 생각합니다. 위치를 기준으로 두 테이블을 병합하는 방법을 찾아야합니다.

아무도 올바른 방향으로 나를 가리킬 수 있습니까?

답변

3

COUNT는 null이 아닌 값의 수를 반환하므로 빈 문자열을 nulls로 변환하여 0을 얻는 방법이 필요합니다.

SELECT location, COUNT(NULLIF(name,'')) AS count FROM table GROUP BY location; 
+0

Perfect! 고맙습니다! 나는 그런 식으로 그것에 접근하려고 생각하지 않았을 것입니다! 당신의 솔루션을 대답으로 표시하지만, 내가 (실패한) 합류를 시도하고 있던 두 테이블을 병합하는 것이 가능한지에 관해서는 여전히 궁금합니다. – aswanson

+0

분명히 가능할 것입니다. 그러나 대답에서 쿼리의 매우 복잡한 버전 일 뿐이므로'NJ '에 대해'2'의 카운트를 얻지 않으려면'NULLIF '를 사용해야합니다. – Mchl