2012-09-07 2 views
0

나는 mysql count에 이상한 문제가있다. 내가다시 mysql "count distinct"

SELECT a.inc AS inc, 
     a.cls AS cls, 
     a.ord AS ord, 
     a.fam AS fam, 
     a.subfam AS subfam, 
     a.gen AS gen, 
     aspec AS spec, 
     asubspec AS subspec 
    FROM a 
    WHERE (ainc = 11) 

를 실행하면 내가 얻을 :

을 나는이 개 기록을 가지고 있기 때문에 즉, 괜찮습니다. 내가

SELECT COUNT(DISTINCT a.inc) AS inc, 
     COUNT(DISTINCT a.cls) AS cls, 
     COUNT(DISTINCT a.ord) AS ord, 
     COUNT(DISTINCT a.fam) AS fam, 
     COUNT(DISTINCT asubfam) AS subfam, 
     COUNT(DISTINCT a.gen) AS gen, 
     COUNT(DISTINCT a.spec) AS spec, 
     COUNT(DISTINCT a.subspec) AS subspec 
    FROM a 
    WHERE (a.inc = 11) 
    GROUP BY a.inc 

을 실행하면

나는

확보하고 gen, spec and subspec 한 행에 0 값을 보는 바와 같이 있기 때문에 그 이상한. count distinct은 0 값을 계산하지 않는다는 것을 알고 있습니다. ! 나는 모든 값을 계산 = 0 내가

`1 | 2 | 2 | 2 | 2 | 1 | 1 | 1 |` 

을 얻으려면 고유 한 카운트 후 나는 또한 시도하려는 :

SELECT COUNT(DISTINCT a.inc) AS inc, 
     SUM(if(a.cls <> 0, 1, 0)) AS cls, 
     SUM(if(a.ord <> 0, 1, 0)) AS ord, 
     SUM(if(a.fam <> 0, 1, 0)) AS fam, 
     SUM(if(a.subfam <> 0, 1, 0)) AS subfam, 
     SUM(if(a.gen <> 0, 1, 0)) AS gen, 
     SUM(if(a.spec <> 0, 1, 0)) AS spec, 
     SUM(if(a.subspec <> 0, 1, 0)) AS subspec 
    FROM a 
GROUP BY a.inc 

SELECT COUNT(DISTINCT a.inc) AS inc, 
      SUM(DISTINCT if(a.cls <> 0, 1, 0)) AS cls, 
      SUM(DISTINCT if(a.ord <> 0, 1, 0)) AS ord, 
      SUM(DISTINCT if(a.fam <> 0, 1, 0)) AS fam, 
      SUM(DISTINCT if(a.subfam <> 0, 1, 0)) AS subfam, 
      SUM(DISTINCT if(a.gen <> 0, 1, 0)) AS gen, 
      SUM(DISTINCT if(a.spec <> 0, 1, 0)) AS spec, 
      SUM(DISTINCT if(a.subspec <> 0, 1, 0)) AS subspec 
FROM a 
GROUP BY a.inc 

을하지만 먼저 때문에 작동하지 않습니다 접근법은 뚜렷한 것을 만들지 않고 0보다 큰 모든 중복 값을 합산합니다. 두 번째 경우에는 단지 1과 0을 제공합니다.
누군가가 나를 도와 줄 수 있습니까? 미리 감사드립니다. 레오

+1

은 무엇하게 당신이 DISTINCT 생각 0 값을 계산하지 않습니다 :

(나는 또한 의해 그룹, 도움이되지 않았다 제거) 이런 식으로 뭔가를 시도? _NULL_ 값은 계산하지 않지만 NULL은 0과 다릅니다. – Barmar

답변

3

나는 distinct가 0으로 간주하지 않는다는 것을 알고 있습니다.

나는 그 아이디어가 어디 있는지 모르지만 정확하지 않습니다. 아마도 당신은 NULL 값을 생각하고 있습니까? 원하는 결과를 얻는 한 가지 방법은 고유 카운트에서 0을 NULL로 처리하는 것입니다.

SELECT COUNT(DISTINCT case when a.inc = 0 then null else a.inc end) AS inc, 
     COUNT(DISTINCT case when a.cls = 0 then null else a.cls end) AS cls, 
     COUNT(DISTINCT case when a.ord = 0 then null else a.ord end) AS ord, 
     COUNT(DISTINCT case when a.fam = 0 then null else a.fam end) AS fam, 
     COUNT(DISTINCT case when a.subfam = 0 then null else a.subfam end) AS subfam, 
     COUNT(DISTINCT case when a.gen = 0 then null else a.gen end) AS gen, 
     COUNT(DISTINCT case when a.spec = 0 then null else a.spec end) AS spec, 
     COUNT(DISTINCT case when a.subspec = 0 then null else a.subspec end) AS subspec 
    FROM a 
    WHERE (a.inc = 11) 
+0

정말 고마워요! –

2
SELECT COUNT(DISTINCT a.inc) AS inc, 
     COUNT(DISTINCT NULLIF(a.cls, 0)) AS cls, 
     COUNT(DISTINCT NULLIF(a.ord, 0)) AS ord, 
     COUNT(DISTINCT NULLIF(a.fam, 0)) AS fam, 
     COUNT(DISTINCT NULLIF(a.subfam, 0)) AS subfam, 
     COUNT(DISTINCT NULLIF(a.gen, 0)) AS gen, 
     COUNT(DISTINCT NULLIF(a.spec, 0)) AS spec, 
     COUNT(DISTINCT NULLIF(a.subspec, 0)) AS subspec 
FROM a 
+1

NULLIF는 Ike Walter의 답변에서 CASE 구문과 동일한 MySQL 함수입니다. – Barmar

+0

맙소사, 이건 아주 우아 해요! 고맙습니다! :) –