2015-04-22 111 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