我需要一些帮助来理顺一些东西,我知道这是一个非常容易的简单问题,但它在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,等等)