使用SQL语句对数据进行简单报表汇总

         最近在制作报表时,遇到一个稍稍复杂一点的报表需求,即用户希望报表能对统计的数据进行分类小计,如下: 

 

       而我之前的统计都是使用Group By来对数据进行简单的汇总,如下:

 

所以对这样的新的需求觉得一时无从下手,询问了同事后才知道,可以使用Rollup统计函数(也称分析函数)来解决这个问题,查询资料后一试,发现果然可以,在此简单介绍一下。

 

Rollup运算符(在生成包含小计和合计的报表时很有用)是SelectGroup By子句的一部分,它生成的结果集中,即包括每个项目的明细行也包括每个组的汇总行,汇总行显示了该组的聚合合计。Group By子句可用于生成只包含各组的聚合而不包含其明细行的结果。使用方法为:Select A, B, sum(fee) From T Group By A, B with Rollup

 

下面介绍一下Rollup的统计规则,比如如果要对(A,B,C)三个字段进行Rollup汇总统计的话,那么它会先对(A,B,C)三个字段进行汇总统计,然后对(A,B)字段汇总统计并空出字段C对应的位置,然后对(A)字段进行汇总统计并空出BC字段对应的位置,而空出的位置我们可以使用Grouping函数来进行判断,如果为“1”,则说明该空值为Rollup制造,否则为“0”。

 

通过上面的描述,可以看出,当将Rollup的字段从上往下列出时,它会每次将最后一个字段去掉,然后取前面的字段进行汇总统计,所以称为上卷统计,例:

 

select case when grouping(spName)=1 then '合计' else spName end,

       case when grouping(opName)=1 and grouping(spName)=0 then '小计' else opName end,

       sum(sumfare)

from TB_WAP_STAT_FARE

group by spName, opName with rollup 

 

       说到了Rollup就不得不说下Cube,因为CubeRollup功能相似但更为复杂,他们的使用方法都是一样的,但是生成结果集却有所不同。再以上面的对(A,B,C)三个字段进行Cube汇总统计为例,那么它会先对(A,B,C)三个字段进行汇总统计,然后分别对(A,B)(A,C)(B,C)字段进行汇通统计并空出未进行汇总统计的字段对应的值,然后分别对(A)(B)(C)进行汇总统计并空出未进行汇总统计的字段对应的值。

 

       也就是说,Cube是将进行统计的所有字段的所有可能的组合进行汇总统计,这就是它区别于Rollup的地方。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 VB.NET 中,可以使用 SQL 语句对 Excel 数据进行分类汇总。以下是一个示例代码,可以帮助你理解如何使用 SQL 语句对 Excel 进行分类汇总。 假设你有一个包含销售数据的 Excel 表格,其中包含产品名称、销售数量和销售额等信息。你需要对这些销售数据进行分类汇总,以便于进行分析和报表制作。以下是一个示例代码,可以将 Excel 中的销售数据按照产品名称进行分类汇总,并计算每个产品的销售数量和销售额: ``` ' 创建 Excel 应用程序对象 Dim xlApp As New Excel.Application ' 打开 Excel 工作簿文件 Dim xlBook As Excel.Workbook = xlApp.Workbooks.Open("C:\SalesData.xlsx") ' 获取第一个工作表 Dim xlSheet As Excel.Worksheet = xlBook.Sheets(1) ' 定义 SQL 查询语句 Dim sql As String = "SELECT ProductName, SUM(SalesQty) AS TotalSalesQty, SUM(SalesAmount) AS TotalSalesAmount FROM [Sheet1$] GROUP BY ProductName" ' 执行 SQL 查询语句 Dim connString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & xlBook.FullName & ";Extended Properties=""Excel 12.0 Xml;HDR=YES""" Dim conn As New OleDb.OleDbConnection(connString) Dim cmd As New OleDb.OleDbCommand(sql, conn) Dim adapter As New OleDb.OleDbDataAdapter(cmd) Dim ds As New DataSet() adapter.Fill(ds) ' 输出分类汇总结果 For Each row As DataRow In ds.Tables(0).Rows Console.WriteLine("Product: " & row("ProductName")) Console.WriteLine("Sales Qty: " & row("TotalSalesQty")) Console.WriteLine("Sales Amount: " & row("TotalSalesAmount")) Next ' 关闭 Excel 应用程序对象 xlApp.Quit() ``` 在这个示例代码中,我们首先创建了一个 Excel 应用程序对象,然后打开了一个名为 SalesData.xlsx 的 Excel 工作簿文件,并获取了第一个工作表中的数据。然后我们使用 SQL 语句对每个产品进行分类汇总,并将结果存储在一个名为 ds 的数据集对象中。最后,我们遍历了 ds 数据集对象,并输出了分类汇总结果。需要注意的是,这个示例代码中使用了 OleDb 数据库提供程序,因此需要在项目中添加对 System.Data.OleDb 命名空间的引用。如果你使用的是不同版本的 Excel 文件,可能需要修改连接字符串中的扩展属性名称。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值