数据分组--聚合函数使用范例(小计,统计,汇总)实例

数据分组的操作有相关的限制:分组查询返回的列必须要么在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 函数, MINMAX函数,更多函数见联机丛书。

筛选技巧:
    WHERE
子句和 HAVING 子句的区别在于筛选器所应用的信息的类型不同。 WHERE 子句筛选表中的原始信息。 HAVING 子句筛选聚合函数执行后的信息并且一般基于聚合函数的执行结果进行筛选。

快速参考:http://book.csdn.net/bookfiles/121/1001213927.shtml
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值