2017-03-18 4 views
1

0이 아닌 최소값을 찾는 데 문제가 있습니다.SQL이 0이 아닌 최소 값을 찾습니다.

예를 들어, 나는 각 개인이 벌어 들인 금액을 보여주는 테이블을 가지고 있으며 그 중 일부는 아무것도 얻지 못합니다. 나는 무엇이든을 벌지 않으며 가장 적게 (즉 0이 아닌) 적립하는 사람들의 이름을 찾는 사람들을 제외시키고 싶습니다.

나는이 시도 :

SELECT name, earnings 
FROM paylist 
WHERE earnings = (SELECT min(earnings) 
      FROM paylist) AND EXISTS (SELECT * 
             FROM paylist 
             WHERE earning <> 0) 

을하지만 난 분 (실적) 만 0이되고 출력에 어떤 값을 반환하지 않습니다 것을 깨달았다. 쿼리 작성 방법은 무엇입니까?

또한, 나는이를 작성하는 두 가지 방법이있을 수 듣는다 : 집계 함수 (예를 들어, COUNT, SUM, MAX, MIN) 2의 차이는 무엇 어떤 집계 함수 를 사용하지 않고와 1.?

+0

가능한 중복 : 위의 두 최소 비 제로 이익

당신은 단지 하나 개의 행이 적어도 비 제로의 실적과 함께, 당신은 limit를 사용하려는 경우 (더 집계가 필요하지)를 모든 행을 반환합니다 http://stackoverflow.com/questions/2099720/mysql-find-min-but-not-zero –

+0

"find ** the ** person"- 사람이 1 명인 경우 ORDER BY 및 LIMIT 1을 사용할 수 있습니다. –

+0

죄송합니다. 나는 질문을 편집했으며, 결과물에는 최소한의 수입을 얻은 사람들의 이름이 모두 나와야합니다. – Raycherr

답변

1

하위 쿼리의 조건을 사용하여 수입이 0 인 행을 생략하고 최소 수익을 찾아 외부에서 사용합니다.

select name, 
    earnings 
from paylist 
where earnings = (
     select min(nullif(earnings,0)) 
     from paylist 
     ) 

차이점은 첫 번째 인덱스 (있는 경우)을 사용할 수있다 : 분 최소 널이 아닌 값을 반환한다는 사실을 사용하여

select name, 
    earnings 
from paylist 
where earnings = (
     select min(earnings) 
     from paylist 
     where earnings <> 0 
     ) 

또는 사용 nullif.

select * 
from paylist 
where earnings <> 0 
order by earnings 
limit 1 
관련 문제