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表中的所有列。