SQL - select in select in query

SQL - select within select in query

在一个非常标准的问题中,选择所有商品名称及其价格高于平均价格的价格。 使用 having 的查询具有以下形式:

'''SELECT Name, Price FROM items
GROUP BY Name
HAVING Price > 
(SELECT AVG(Price) FROM items )
;'''

似乎只有在 SELECT 语句中使用 AVG 时才会返回列平均值。否则,如果我使用 HAVING Price > AVG(Price),则不会返回任何内容。为什么需要额外的 SELECT 声明,而不是仅在价格上使用 AVG?

这就是 GROUP BY 的工作原理。在查询的 SELECT 部分,您只能拥有 GROUP BY 子句中使用的列,或聚合,如 MINMAXAVG, SUM, 等等。在这种情况下,您要输出的 Price 列的总和是多少?你应该具体说明。

或者,您可以使用窗口函数计算每个名称单元的平均价格,然后添加子查询以对其进行过滤:

SELECT *
FROM (SELECT Name, Price, AVG(Price) OVER (PARTITION BY Name) AS Average_Price
      FROM items) AS X
WHERE X.Price > X.Average_Price

我认为你最好的选择是 WHERE 条件下的简单子查询

select i.*
from items i
where Price > (
    select avg(Price) avgPrice 
    from items ii
    --where ii.Name = i.Name /* add this line if you need average to be calculated per Name */
)