SQL Server 2005参考:数据汇总
SQL Server 2005参考:数据汇总
Sql Server中,简单的数据汇总是通过GROUP BY子句确定分组的依据(可选),再辅以各种聚合函数来实现数据的汇总(例如求和、取平均值、取最大值等)。
如果要更好地实现汇总效果,则还需要配合HAVING子句对汇总结果进行过滤;
如果有分级汇总的要求,则还要使用ROLLUP运算符;
通过使用CUBE运算符,还可以生成多维数据集。
1. HAVING
Having子句和where 子句作用相似,均是用于控制生成结果集中的航筛选器,它指定一系列检索条件,只有满足这些检索条件的行才会在结果集中出现。
与where子句不同的是:
A. Where 子句在聚合之前起作用,不能放到Group By语句之后;
B. Having子句在聚合之后起作用,不能放在Group By子句之前;Having子句的检索条件中,如果引用了输入源的列或是表达式,要求要么出现在聚合函数中,
要么出现在Group by 子句中。
C. 如果不使用Group By, HAVING 的行为与 WHERE 子句一样。
示例
USE AdventureWorks ;
GO
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail sod
GROUP BY SalesOrderID
HAVING SUM(LineTotal) > 100000.00
ORDER BY SalesOrderID ;
2. ROLLUP
Rollup子句通过在SELECT的GROUP BY子句使用WITH指定,它用于生成包含小计和合计的报表(通俗叫法就是分级汇总报表)。一般来说,分级汇总报表可以在程序中实现,
大多数的报表控件也都提供了相关的功能,可以直接使用。不过,掌握如何在数据上实现这样的功能,将会有助于加深T-SQL的理解和应用,也有助于降低对前端应用程序的要求。
下面示例在汇总结果中生成小计和合计信息:
with tb as
(
select item='table',color='red', quantity=124 union all
select item='table',color='blue', quantity=25 union all
select item='chair',color='red',quantity=101 union all
select item='chair',color='blue',quantity=45
)
select item,color,[sum]=sum(quantity)
from tb
group by item,color
with rollup
结果:
item color sum
----- ----- -----------
chair blue 45
chair red 101
chair NULL 146
table blue 25
table red 124
table NULL 149
NULL NULL 295
(7 row(s) affected)
这里可以通过Grouping 函数来确定汇总结果中的NULL值是RollUp晕算法产生的,还是来自原始数据中的值。1 – rollup运算符生成的;0 – 原始数据。
select item,color,[sum]=sum(quantity),item_flg=grouping(item),color_flg=grouping(color)
from tb
group by item,color
with rollup
结果:
item color sum item_flg color_flg
----- ----- ----------- -------- ---------
chair blue 45 0 0
chair red 101 0 0
chair NULL 146 0 1 -- 为chair小计
table blue 25 0 0
table red 124 0 0
table NULL 149 0 1 --为table小计
NULL NULL 295 1 1 -- 合计
(7 row(s) affected)
下面的示例演示如何通过Grouping函数来过滤和优化显示效果。
示例中对于聚合行,显示原始值;对于小计和合计行,根据记录行的级别,将对应的列中的NULL值中填充为总计、合计和小计字样;
Having条件用于过滤掉在Item层次上的合计行数据。