欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SQL Group By测试和理解

程序员文章站 2022-07-12 11:56:25
...
Orders数据如下:
SQL Group By测试和理解
            
    
    博客分类: Java SQLPostgreSQLASP.netCC++ 

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的优先级别是什么?




  • SQL Group By测试和理解
            
    
    博客分类: Java SQLPostgreSQLASP.netCC++ 
  • 大小: 33.9 KB