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子句通过在SELECTGROUP 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层次上的合计行数据。

posted @ 2009-07-18 23:03  杰克帝.NET  阅读(761)  评论(0编辑  收藏  举报