GROUP BY / aggregate function confusion in SQL
我需要一些帮助来理顺一些问题,我知道这是一个非常简单的问题,但这在SQL中使我有些困惑。
此SQL查询在Oracle中引发"不是GROUP BY表达式"错误。 我知道为什么,因为我知道一旦按元组的属性进行分组,就无法再访问任何其他属性。
1 2 3 | SELECT * FROM order_details GROUP BY order_no |
但是这个确实有效
1 2 3 | SELECT SUM(order_price) FROM order_details GROUP BY order_no |
只是为了具体说明我的理解。...假设每个订单的order_details中有多个元组,一旦我根据order_no对元组进行分组,我仍然可以访问组中每个元组的order_price属性, 但仅使用聚合函数?
换句话说,聚合函数在SELECT子句中使用时能够深入到组中以查看"隐藏"属性,在其中简单地使用" SELECT order_no"将引发错误?
在标准SQL(但不是MySQL)中,当您使用GROUP BY时,必须列出GROUP BY子句中未聚合的所有结果列。因此,如果
您也可以这样做:
1 2 3 | SELECT order_no, SUM(order_price) FROM order_details GROUP BY order_no; |
这将起作用,因为所有非聚合列都在GROUP BY子句中列出。
您可以执行以下操作:
1 2 3 | SELECT order_no, order_price, MAX(order_item) FROM order_details GROUP BY order_no, order_price; |
这个查询不是很有意义(或者很可能是没有意义的),但是它会"起作用"。它将列出每个单独的订单编号和订单价格组合,并给出与该价格关联的最大订单商品(编号)。如果订单中的所有项目都具有不同的价格,则最终将导致每行一组。 OTOH,如果订单中有多个价格相同的商品(每个价格£ 0.99),它将把它们组合在一起并返回该价格下的最大订单商品编号。 (我假设表在
使用通用表表达式(CTE)可以避免此问题。
多个CT也很方便,粘贴了我曾经使用过的情况...可能会有所帮助
1 2 3 4 5 6 | WITH ranked_cte1 AS ( SELECT r.mov_id,DENSE_RANK() OVER ( ORDER BY r.rev_stars DESC )AS rankked FROM ratings r ), ranked_cte2 AS ( SELECT * FROM movie WHERE mov_id=(SELECT mov_id FROM ranked_cte1 WHERE rankked=7 ) ) SELECT * FROM ranked_cte2 SELECT * FROM movie WHERE mov_id=902 |
1 2 3 | SELECT * FROM order_details GROUP BY order_no |
在上面的查询中,您选择了所有列,因为它会引发错误,而不是按类似项进行分组。
为了避免您不得不提及所有列,无论在select语句中是哪个,所有列都必须在group by子句中。
1 2 3 | SELECT * FROM order_details GROUP BY order_no,order_details,etc |
等等,这意味着order_details表中的所有列。
要使用group by子句,您必须提及select语句中的所有列到group by子句中,而不是聚合函数中的列。
为此,您可以使用partition by by子句来代替group by,而只能使用一个端口将其作为group by。
您也可以将其划分为1