2011-02-28 9 views
3

쿼리를 실행하여 최대 값과 최소값을 찾은 다음 조건부 연산자를 사용하려고합니다. 그러나 다음 쿼리를 실행하려고하면 "aggregate : min()"오 류가 발생합니다.최소/최대 조건 연산자 사용

내 쿼리는 다음과 같습니다

SELECT a.prim_id, min(b.new_len*36) as min_new_len, max(b.new_len*36) as max_new_len 
FROM tb_first a, tb_second b 
WHERE a.sec_id = b.sec_id AND min_new_len > 1900 AND max_new_len < 75000 
GROUP BY a.prim_id 
ORDER BY avg(b.new_len*36); 

어떤 제안?

+1

어떤 RDBMS를 사용하고 있습니까? HAVING 절에서 별칭을 사용할 수 있는지 여부는 다양합니다. –

답변

5

집계가 포함 된 식으로 필터링하려면 HAVING 절을 사용해야합니다.

MySQL을 사용하는 경우 사용자는 할 수없는 다른 RDBMS에 대해 해당 절의 별칭을 사용할 수 있습니다.

SELECT a.prim_id, 
     min(b.new_len * 36) as min_new_len, 
     max(b.new_len * 36) as max_new_len 
FROM tb_first a 
     JOIN tb_second b 
     ON a.sec_id = b.sec_id /*<-- Use explicit JOIN syntax...*/ 
GROUP BY a.prim_id 
HAVING min(b.new_len * 36) > 1900 
     AND max(b.new_len * 36) < 75000 
ORDER BY avg(b.new_len * 36); 

많은 RDBMS에 당신은 또한 인라인 뷰에 쿼리를 넣을 수 있습니다 대신 수식을 반복하는 열 별칭을 사용하는 것과 선택합니다. 이 경우 아래와 같이 WHERE을 사용하십시오.

SELECT prim_id, 
     min_new_len, 
     max_new_len 
from (SELECT a.prim_id, 
       min(b.new_len * 36) as min_new_len, 
       max(b.new_len * 36) as max_new_len, 
       avg(b.new_len * 36) as avg_new_len 
     FROM tb_first a 
       JOIN tb_second b 
       ON a.sec_id = b.sec_id 
     GROUP BY a.prim_id) derived 
WHERE min_new_len > 1900 
     AND max_new_len < 75000 
ORDER BY avg_new_len; 
1

WHERE 절은 집계 전에 개별 '입력'레코드를 필터링합니다.

HAVING 절은 집계 후에 결과 '출력'레코드를 필터링합니다.

Martin의 답변을 제공하십시오.