• 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层次上的合计行数据。

  • 相关阅读:
    jQuery:提交表单前判断表单是否被修改过
    jQuery multiselect的使用
    input[file]标签的accept=”image/*”属性响应很慢的解决办法
    Linux-read命令
    shell编程学习
    优化网站加载速度
    select下拉框选中问题
    QTableWidget class
    QLabel class
    QMainWindow class
  • 原文地址:https://www.cnblogs.com/Dlonghow/p/1526299.html
Copyright © 2020-2023  润新知