SQL中的GROUP BY /聚合函数混淆

我需要一些帮助来理清一些东西,我知道这是一个非常简单的问题,但是这在SQL中会让我感到困惑。

此SQL查询在Oracle中引发“不是GROUP BYexpression式”错误。 我明白为什么,据我所知,一旦我通过元组的属性分组,我不能再访问任何其他属性。

SELECT * FROM order_details GROUP BY order_no 

但是这个工作

 SELECT SUM(order_price) FROM order_details GROUP BY order_no 

只是为了具体了解我的理解。假设每个order_details中有多个元组,我一旦按照order_no对元组进行分组,我仍然可以访问组中每个元组的order_price属性,但只使用聚合函数?

换句话说,在SELECT子句中使用聚合函数时,能够深入到组中查看“隐藏”属性,只需使用“SELECT order_no”就会引发错误?

感谢您的帮助,澄清这一点,我很难在Google上find这个具体问题的答案。

克里斯

在标准SQL(而不是MySQL)中,使用GROUP BY时,必须列出GROUP BY子句中不是聚合的所有结果列。 因此,如果order_details有6列,则必须在GROUP BY子句中列出所有6列(按名称 – 不能在GROUP BY或ORDER BY子句中使用* )。

你也可以这样做:

 SELECT order_no, SUM(order_price) FROM order_details GROUP BY order_no; 

这将工作,因为所有的非聚合列在GROUP BY子句中列出。

你可以做这样的事情:

 SELECT order_no, order_price, MAX(order_item) FROM order_details GROUP BY order_no, order_price; 

这个查询并不真正有意义(或者很可能不是有意义的),但是它会“有效”。 它将列出每个单独的订单号码和订单价格组合,并将给出与该价格相关联的最大订单项目(数量)。 如果订单中的所有项目都有不同的价格,那么最终会得到一组一行。 OTOH,如果订单中有几个项目以相同的价格(比如每个0.99英镑),那么它将把这些项目组合在一起,并以该价格返回最大订单项目编号。 (我假设表上有一个主键(order_no, order_item) ,其中order_item = 1的第一个项目,第二个项目是2等)

要使用group by子句,您必须提及select语句中的所有列到group by子句,而不是来自聚合函数的列。

要做到这一点,而不是组,你可以使用分区的子句,你可以使用只有一个端口分组为一个分区。

你也可以把它作为1的分区

 SELECT * FROM order_details GROUP BY order_no 

在上面的查询中,您正在select所有的列,因为它抛出一个错误而不是类似的东西,以避免你必须提及所有的列,无论在select语句中的所有列必须在group by子句..

  SELECT * FROM order_details GROUP BY order_no,order_details,etc 

这意味着从order_details表中的所有列。