2011-02-28 79 views
3

我想運行一個查詢,找到最大值和最小值,然後使用條件運算符。但是,當我嘗試運行以下查詢時,它給了我錯誤 - 「濫用聚合: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'子句中使用別名,它會有所不同嗎? – 2011-02-28 23:22:00

回答

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子句聚合後過濾生成的「輸出」的記錄。

給予張貼馬丁的答案。