导航

GROUP BY 以及 OVER( PARTITION BY)

Posted on 2013-09-26 14:47  超申  阅读(1173)  评论(0)    收藏  举报

Group by 与 Over (Partition by) 都可以实现分组统计功能.

Group by 根据一列或者多列的值或表达式将选定的行进行一个摘要分组,每一个分组都返回一行.

SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail AS sod
where SalesOrderID in (43659,43660)
GROUP BY SalesOrderID
ORDER BY SalesOrderID;
View Code

查询结果:

 

使用表达式以及Having 语句的Group by:

SELECT DATEPART(yyyy,OrderDate) AS 'Year'
    ,SUM(TotalDue) AS 'Total Order Amount'
FROM Sales.SalesOrderHeader
GROUP BY DATEPART(yyyy,OrderDate)
HAVING DATEPART(yyyy,OrderDate) >= '2003'
ORDER BY DATEPART(yyyy,OrderDate);
View Code

Group by 通常与聚合函数一起使用. Group By 语句后面的item或者表达式必须在select语句中出现,否则就会出现语法错误。

 

2. Over (Partition By) 语句 也可以实现分组统计的功能,但是它并不会对统计的结果进行分组.针对每一条记录,它都会返回分组统计的结果。

SELECT  DATEPART(yyyy,OrderDate) AS N'Year',SalesOrderID
    ,SUM(TotalDue) OVER (PARTITION  by DATEPART(yyyy,OrderDate)) AS N'Total Order Amount'
FROM Sales.SalesOrderHeader

ORDER BY DATEPART(yyyy,OrderDate);
View Code

 

 

所以,在需要显示每一列的记录以及同时显示一些聚合的信息时,应该使用Over partition by 语句.