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

本文介绍了SQL中的分组查询及聚合函数的应用,包括COUNT()、SUM()等,并通过实例展示了如何利用GROUP BY、ROLLUP等进行数据汇总,还探讨了累加和的计算方法及其性能比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据分组的操作有相关的限制:分组查询返回的列必须要么在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.youkuaiyun.com/bookfiles/121/1001213927.shtml
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值