我需要有人可以向我解释"这里不允许组功能";因为我不理解它,而我想理解它。
我必须得到产品名称和单价高于平均价格的产品
我最初尝试使用这个,但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…)。