我有一个表格,其中包含许多CD条目,包括名称,价格和流派。我正在尝试按流派返回平均价格,因此"摇滚","流行","另类摇滚","电子乐"和"电子之家"的平均价格。之后,我尝试让它自动显示平均价格最高的流派。
该表称为"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);
但是,我可能会错过此方法的某些内容,因为我不太熟悉"as"命令及其正确用法。
行(几乎)总是比列容易。因此,您首先要做的是获取每种类型的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
)
你正在使用MySQL,因为你提到了PHP:
与马克的回答类似:
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