数据分组的操作有相关的限制:分组查询返回的列必须要么在GROUP BY列表中引用,要么用在聚合函数中。其它列可用于进行过滤操作或者排序操作,但是这些列的值不能在结果集中返回。
聚合函数都是标量聚合函数(只返回一个值的函数)并且一般都针对一个记录集合进行操作。
以下全部使用示例数据库AdventureWorks.
1、汇总行数 Count() :示例:在客户数量大于50的城市中,每个城市中有多少客户?
SELECT City, COUNT(*) AS [Count of Customers]
FROM Person.Address
GROUP BY City
HAVING (COUNT(*) > 50)
ORDER BY City
2、汇总与合计 SUM():使用ROLLUP来计算小计:环境(SQL2005 示例数据库:AdventureWorks)
示例:-列出各产品销售收入合计是多少?
---常规性显示。
SELECT ROW_NUMBER()OVER (ORDER BY C.Name),
C.Name AS Category,
S.Name AS SubCategory,
SUM(O.LineTotal) AS Sales
FROM Sales.SalesOrderDetail AS O
INNER JOIN Production.Product AS P
ON O.ProductID = P.ProductID
INNER JOIN Production.ProductSubcategory AS S
ON P.ProductSubcategoryID = S.ProductSubcategoryID
INNER JOIN Production.ProductCategory AS C
ON S.ProductCategoryID = C.ProductCategoryID
GROUP BY C.Name, S.Name WITH ROLLUP

--友好显示结果
SELECT ROW_NUMBER()OVER (ORDER BY C.Name),
CASE GROUPING(C.Name)
WHEN 1 THEN N'总计: '
ELSE C.Name
END AS Category,
CASE GROUPING(S.Name)
WHEN 1 THEN N'子类合计:'
ELSE S.Name
END AS SubCategory,
SUM(O.LineTotal) AS Sales,
GROUPING(C.Name) AS IsCategoryGroup,
GROUPING(S.Name) AS IsSubCategoryGroup
FROM Sales.SalesOrderDetail AS O
INNER JOIN Production.Product AS P
ON O.ProductID = P.ProductID
INNER JOIN Production.ProductSubcategory AS S
ON P.ProductSubcategoryID = S.ProductSubcategoryID
INNER JOIN Production.ProductCategory AS C
ON S.ProductCategoryID = C.ProductCategoryID
GROUP BY C.Name, S.Name WITH ROLLUP
小计--技巧:合理使用到GROUPING()函数与 CUBE 或 ROLLUP 运算符
效果图:
3、计算累加和 :示例:显示销售日报表,效果图,(表达式:销售额按日期累加 actual sales=actual sales(前一日的)+sales)

--方法1: 使用子查询来计算累加和
SELECT OrderDate,
SUM(TotalDue) AS Sales,
(
SELECT SUM(TotalDue)
FROM Sales.SalesOrderHeader
WHERE (OrderDate <= A.OrderDate)
)
AS [Actual Sales]
FROM Sales.SalesOrderHeader AS A
GROUP BY OrderDate
ORDER BY OrderDate

--方法2: 使用用户定义函数来计算累加和
CREATE FUNCTION SalesToDate(@ThisDate datetime)
RETURNS money
AS
BEGIN
RETURN (SELECT SUM(TotalDue) AS Expr1
FROM Sales.SalesOrderHeader
WHERE (OrderDate <= @ThisDate))
END

SELECT OrderDate,
SUM(TotalDue) AS Sales,
dbo.SalesToDate(A.OrderDate) AS [Actual sales]
FROM Sales.SalesOrderHeader AS A
GROUP BY OrderDate
ORDER BY OrderDate
比较两个查询的执行性能,
1. 在SQL Server Management Studio中打开查询菜单。
2. 选择“包括客户端统计信息”项。
3. 再次执行前面保存过的两套查询。现在将出现随“结果”选项卡一起显示出来的“客户端统计信息”选项卡。可以通过其中提供的信息来了解这两种查询所消耗的时间。
下图只显示了这两种查询的统计信息的部分内容。(子查询)

用户函数

结论:用户定义函数的查询所消耗的时间是使用子查询的查询所消耗时间的2倍以上,推荐使用子查询方式。
更多可用的聚合选项并不只是计算和合计。还可以在查询中使用基础和高级的统计函数。同前面所介绍的函数一样,这些函数允许直接操作数据库以获得结果集,能够产生优异的处理效率。如:AVG函数,MIN 和 MAX函数,更多函数见联机丛书。
筛选技巧:
WHERE子句和HAVING子句的区别在于筛选器所应用的信息的类型不同。WHERE子句筛选表中的原始信息。HAVING子句筛选聚合函数执行后的信息并且一般基于聚合函数的执行结果进行筛选。
快速参考:http://book.youkuaiyun.com/bookfiles/121/1001213927.shtml
聚合函数都是标量聚合函数(只返回一个值的函数)并且一般都针对一个记录集合进行操作。
以下全部使用示例数据库AdventureWorks.
1、汇总行数 Count() :示例:在客户数量大于50的城市中,每个城市中有多少客户?





2、汇总与合计 SUM():使用ROLLUP来计算小计:环境(SQL2005 示例数据库:AdventureWorks)
示例:-列出各产品销售收入合计是多少?














--友好显示结果




















效果图:
3、计算累加和 :示例:显示销售日报表,效果图,(表达式:销售额按日期累加 actual sales=actual sales(前一日的)+sales)





























比较两个查询的执行性能,
1. 在SQL Server Management Studio中打开查询菜单。
2. 选择“包括客户端统计信息”项。
3. 再次执行前面保存过的两套查询。现在将出现随“结果”选项卡一起显示出来的“客户端统计信息”选项卡。可以通过其中提供的信息来了解这两种查询所消耗的时间。
下图只显示了这两种查询的统计信息的部分内容。(子查询)
用户函数
结论:用户定义函数的查询所消耗的时间是使用子查询的查询所消耗时间的2倍以上,推荐使用子查询方式。
更多可用的聚合选项并不只是计算和合计。还可以在查询中使用基础和高级的统计函数。同前面所介绍的函数一样,这些函数允许直接操作数据库以获得结果集,能够产生优异的处理效率。如:AVG函数,MIN 和 MAX函数,更多函数见联机丛书。
筛选技巧:
WHERE子句和HAVING子句的区别在于筛选器所应用的信息的类型不同。WHERE子句筛选表中的原始信息。HAVING子句筛选聚合函数执行后的信息并且一般基于聚合函数的执行结果进行筛选。
快速参考:http://book.youkuaiyun.com/bookfiles/121/1001213927.shtml