2015-04-22 108 views
0

我有一張表,其中包含大量的CD Entrys,幷包含名稱,價格和流派。我試圖按類型返回平均價格,所以「Rock」,「Pop」,「Alternative Rock」,「Electronica」的平均價格,&「Electro House」。之後,我試着讓它自動顯示最高平均價格的流派。計算多個平均值中的最大值 - SQL

表被稱爲「CD」,那麼表列CD.ID,CD.Title,CD.Price & CD.Genre

我也已經使用如下所示這種方法試過..這是目前只是試圖建立不同的平均值爲體裁的3 ..

SELECT ((SELECT AVG(cdPrice) FROM CD 
     WHERE 
     CD.Genre = 'Rock') as Rock, 
     (SELECT AVG(cdPrice) FROM CD 
     WHERE 
     CD.Genre = 'Pop') as Pop, 
     (SELECT AVG(cdPrice) FROM CD 
     WHERE 
     CD.Genre = 'Electro') as Electro); 

不過我可能會丟失用這種方法什麼的,因爲我不是太熟悉的「爲」命令和它的正確使用。

+1

什麼DBMS? Sql Server? – aquinas

+0

使用PHP的我的管理員我的管理員 – TyKitsune

+0

OK :)所以... MySQL? – aquinas

回答

3

行(幾乎)總是比列更容易。所以,你想要做的第一件事就是讓AVG價格爲每個流派:

SELECT 
    AVG(CdPrice) as Price, Genre 
FROM CD 
GROUP BY Genre 

第二部分是過濾出的具有最高AVG(CdPrice)。這裏有幾種不同的選擇,它有點取決於你的要求如果兩種流派的價格相同,會發生什麼?你想要兩個還是隨機的?後者一個簡單的辦法就是命令集,然後選擇第一行:

SELECT TOP(1) 
    AVG(CdPrice) as Price, Genre 
FROM CD 
GROUP BY Genre 
ORDER BY 
    Price DESC 

如果你想聯繫的情況下,兩行,你可以先找到一組的最大,然後做一個自聯接找到任何匹配:

SELECT Price, Genre 
FROM (
    --First table is our avg price per genre 
    SELECT AVG(CdPrice) as Price, Genre FROM CD GROUP BY Genre 
) as Avg 
JOIN (
    --Second table is the maximum avg price 
    SELECT MAX(Price) FROM (
     SELECT AVG(CdPrice) as Price FROM CD GROUP BY Genre 
    ) as Avg2 
) as Max ON 
    --Join on price to find genres that have the maximum price 
    Avg.Price = Max.Price 

或者,你可以採取HAVING條款的優勢,寫(可以說)乾淨了一點:

SELECT AVG(CdPrice) as Price, Genre 
FROM CD 
GROUP BY Genre 
HAVING AVG(CdPrice) = (
    SELECT MAX(Price) FROM (SELECT AVG(CdPrice) as Price FROM CD GROUP BY Genre) A 
) 
+0

這是造成語法錯誤,我明白你想要做什麼,但它似乎並沒有工作? – TyKitsune

+0

你需要添加一個子選擇。 – aquinas

+0

非常好!你是對的!非常感謝:D – TyKitsune

1

會因爲你提到的PHP假設你使用MySQL:

馬克的回答相似:

select * from (
    SELECT AVG(CdPrice) as Price, Genre 
    FROM CD GROUP BY Genre 
)averages 
order by Price desc 
limit 1; 

http://www.sqlfiddle.com/#!9/852cd/1