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

Chr*_*ris 41 sql oracle

我需要一些帮助来理顺一些东西,我知道这是一个非常容易的简单问题,但它在SQL中稍微让我感到困惑.

此SQL查询在Oracle中引发"非GROUP BY表达式"错误.我理解为什么,正如我所知,一旦我按元组的属性进行分组,我就再也无法访问任何其他属性了.

SELECT * 
FROM order_details 
GROUP BY order_no
Run Code Online (Sandbox Code Playgroud)

不过这个确实有效

SELECT SUM(order_price)
FROM order_details
GROUP BY order_no
Run Code Online (Sandbox Code Playgroud)

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

换句话说,在SELECT子句中使用的聚合函数能够深入到组中以查看"隐藏"属性,其中简单地使用"SELECT order_no"会抛出错误?

Jon*_*ler 45

在标准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;
Run Code Online (Sandbox Code Playgroud)

这将起作用,因为所有非聚合列都列在GROUP BY子句中.

你可以这样做:

SELECT order_no, order_price, MAX(order_item)
  FROM order_details
 GROUP BY order_no, order_price;
Run Code Online (Sandbox Code Playgroud)

这个查询真的没有意义(或者很可能没有意义),但它会"有用".它将列出每个单独的订单号和订单价格组合,并将给出与该价格相关联的最大订单商品(编号).如果订单中的所有商品都有不同的价格,您最终会得到每组一组.OTOH,如果订单中的多个商品价格相同(比如说每个0.99英镑),那么它会将这些商品组合在一起并以该价格返回最大订单商品编号.(我假设表中有一个主键,(order_no, order_item)顺序中的第一个项目order_item = 1,第二个项目是2,等等)

  • @Chris:是的,或多或少.您可以将GROUP BY分区为表中的行; 每个组对GROUP BY子句中列出的列具有相同的值集.然后,聚合操作在指定的任何列上,聚合计算在组中的行上.然后,结果包含每组一行,GROUP BY列值以及关联的聚合.嗯...我希望这很清楚...... (5认同)