liusu 发表于 2013-1-30 01:38:58

SQL Group By测试和理解

Orders数据如下:
http://liusu.iteye.com/upload/attachment/102869/4e96da03-f07d-32ec-b35d-9cb0f4ccaad8.jpg

SQL GROUP BY的作用:
The SQL GROUP BY statement is used along with the SQL aggregate functions like SUM to provide means of grouping the result dataset by certain database table column(s). Seehttp://www.sql-tutorial.net/SQL-GROUP-BY.asp

GROUP BY用于和SQL聚合函数(类似SUM)一起按照给定的数据表列给查询结果集合分组的。

一个必须注意的地方是:SELECT 列表中指定的每一列也必须出现在 GROUP BY 子句中,除非这列是聚合函数列。

仔细想想应该是这样理解的(为方便测试,贴SQL语句)
--SELECT * FROM "Orders";--SELECT "Customer","OrderDate",SUM("OrderPrice") FROM "Orders" GROUP BY "OrderDate";--SELECT "Customer","OrderDate",SUM("OrderPrice") FROM "Orders" GROUP BY "OrderDate";--上面的语句报错:--ERROR: column "Orders.Customer" must appear in the GROUP BY clause or be used in an aggregate function--SELECT 列表中指定的每一列也必须出现在 GROUP BY 子句中,除非这列是用于聚合函数。 --原因:Group by会将结果集合并。上面的SELECT结果根据OrderDate合并集合。--假设没有上面那个限制,会出现如下的冲突情况:记录3和记录7的OrderDate都是2008/07/21,将他们按照SUM(OrderPrice)求得值为1700,如果SELECT列中允许--出现Customer列(一个不出现在Group By中的列),那么这条记录的Customer列的值应该显示什么呢?是Carter(7)还是Bush(3)呢?--所以:SELECT 列表中指定的每一列也必须出现在 GROUP BY 子句中,除非这列是用于聚合函数。 --使用聚合函数必须结合Group By子句来使用。--SELECT "Customer",SUM("OrderPrice") from "Orders";--上面的语句报错:--ERROR: column "Orders.Customer" must appear in the GROUP BY clause or be used in an aggregate function--错误的理解过上面的一致。在不给定Group BY条件的情况下,SUM("OrderPrice"),这个聚合函数默认使用所有记录。同样会出现CUSTOMER冲突的情况。--SELECT "Customer","OrderDate",SUM("OrderPrice") FROM "Orders" GROUP BY "OrderDate","Customer";--上面这句select查询时可以跑的。但是只Group by了OrderDate,至于Customer为什么给忽略掉了,不明白。也想不通“正确执行”下来会是什么结果。SELECT "Customer","OrderDate",SUM("OrderPrice") FROM "Orders" GROUP BY "Customer","OrderDate"--Group by的条件换了一下顺序,Customer放在前面,查询的结构是一样的。奇怪了。Customer,OrderDate的优先级别是什么?
页: [1]
查看完整版本: SQL Group By测试和理解