此处不允许使用 Oracle Sql组函数



我需要有人可以向我解释"这里不允许组功能";因为我不理解它,而我想理解它。

我必须得到产品名称和单价高于平均价格的产品

我最初尝试使用这个,但oracle很快告诉我这是错误的。

SELECT productname,unitprice
FROM products
WHERE unitprice>(AVG(unitprice));

搜索信息,发现我可以这样得到它:

SELECT productname,unitprice FROM products
WHERE unitprice > (SELECT AVG(unitprice) FROM products);

我想知道的是你为什么放两个选择?

group function is not allowed是什么意思?我不止一次遇到这个错误,我希望能够理解当它出现

时该怎么办非常感谢您的宝贵时间

此处不允许使用短语"组功能"指的是任何在某种程度上属于"聚合"的事物;例如SUM, MIN, MAX等。这些函数必须在一组的行上操作,并且要在一组行上操作您需要执行SELECT语句。(我在这里省略了UPDATE/DELETE)

如果不是这样的话,你最终会得到歧义,例如,让我们说我们允许这个:

select *
from   products
where  region = 'USA'
and    avg(price) > 10

这意味着你想要所有产品的平均价格,还是只想要这些产品在美国的平均价格?语法不再是确定性的。

还有一个选项:

SELECT *
FROM (
SELECT productname,unitprice,AVG(unitprice) OVER (PARTITION BY 1) avg_price
FROM products)      
WHERE unitprice > avg_price

你原来的SQL不能工作的原因是你没有告诉Oracle如何计算平均值。它应该在哪个表中找到它?它应该包括哪些行?如果有的话,你希望申请什么分组?这些都没有与"WHERE unitprice>(AVG(unitprice))"进行沟通。

现在,作为一个人,我可以做出一个相当有根据的猜测,您打算以相同的粒度(没有分组)对从主查询中选择的同一组行进行平均。我们可以通过使用子查询在表上进行第二次传递来实现,正如您的第二个SQL所做的那样,聚合函数的新窗口功能在内部对查询块结果进行第二次传递,就像我在我的回答中所做的那样。使用OVER子句,您可以告诉Oracle要包含哪些行(rows BETWEEN…)以及如何分组(PARTITION BY…)。

最新更新