2011-12-31 158 views
2

的離羣值查詢使用下面的查詢來檢測平均snowlevel和最小snowlevel之間10釐米的差異。但PhpMyadmin說這是對組功能的無效使用。看不出有什麼問題。你知道嗎?使用group by

SELECT lud, res_id, resort, 
MIN(snow_valley) as snow_val_min, 
MAX(snow_valley) as snow_val_max, 
ROUND(AVG(snow_mountain),0) as snow_mnt_avg, 
MIN(snow_mountain) as snow_mnt_min 
from sv_condition_sw 
where (lud ='2011-12-31') AND (AVG(snow_mountain)-MIN(snow_mountain)>10) GROUP by res_id 

回答

2

您在select by group by中的每一列必須是聚合在一起或包含在group by中。在聚集表達式條件必須出現在having子句中,像這樣的:

SELECT lud, res_id, resort, 
MIN(snow_valley) as snow_val_min, 
MAX(snow_valley) as snow_val_max, 
ROUND(AVG(snow_mountain),0) as snow_mnt_avg, 
MIN(snow_mountain) as snow_mnt_min 
from sv_condition_sw 
where (lud ='2011-12-31') 
GROUP by lud, res_id, resort 
HAVING AVG(snow_mountain)-MIN(snow_mountain)>10 
0

的原因錯誤是一個SQL查詢的執行順序是FROM - >WHERE - >GROUP BY - >HAVING - >SELECT - >ORDER BY。因此,您在WHERE中的AVG()MIN()不會在GROUP BY之後進行評估。

使用那些有aggreagte功能HAVING條件,而不是在WHERE

SELECT lud, res_id, resort, 
    MIN(snow_valley) AS snow_val_min, 
    MAX(snow_valley) AS snow_val_max, 
    ROUND(AVG(snow_mountain),0) AS snow_mnt_avg, 
    MIN(snow_mountain) AS snow_mnt_min 
FROM sv_condition_sw 
WHERE (lud ='2011-12-31') 
GROUP by res_id 
HAVING (AVG(snow_mountain)-MIN(snow_mountain)>10)