Excel实例下载
  VBA  应用教程
    数据库SQL知识
设为首页
Having - 筛选汇总后的数据
作者:bengdeng | 来源:Excel吧 | 时间:2008-10-17 | 阅读权限:游客 | 会员币:0 | 【

前面一篇 SQL语言教程 里介绍了Select的第二个子句Group By,这一篇要说明的是第三个子句Having。Having子句的功能是筛选Group By汇总后的数据,只有有Group By的情况下,才可以用Having,其作用有点类似于用Where来筛选Select的结果。其语法是:

SELECT 条件列名1, 函数(汇总列名1)  FROM 表格名  GROUP BY 条件列名1 HAVING (函数条件)

要说明的是,Having后面出现的函数条件,应该在Selet中有列出来的,否则会出错。

为了更好的理解Having,我们还是举个例子,在上一篇介绍Group By中,我们举的例子是:按物品名称汇总所有进仓表中各个物品的进仓数量,并列在一个新的工作表中。而如果只要列出汇总数大于等于10的所有物品的汇总,这里就需要多加一个Having了。

Sub 进销存表数据库中按筛选分类汇总进仓表后的数据()
'*******************************************
'时间:2008-10-17
'作者:bengdeng
'功能:在程序文件同一目录下进销存表数据库中筛选分类汇总进仓表后的数据
'注意:要在工具/引用中引用microsoft activex date objects x.x
'      其中x.x为版本号,可能会因为你安装的office的版本不同而不同,本例引用了2.5版
'发布:http://www.excelba.com
'*******************************************
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim WN As String
Dim TableName As String
Dim sSql As String
Dim xSh As Worksheet
Dim sRan As Range
Dim ii As Integer

WN = "进销存表.mdb"
TableName = "进仓表"
'需要写入的工作表名称
Set xSh = ThisWorkbook.Worksheets.Add
'标题开始单元格
Set sRan = xSh.Range("A1")

Set conn = New ADODB.Connection
conn.ConnectionString = "Provider=Microsoft.Jet.Oledb.4.0;" & _
                        "Data Source=" & ThisWorkbook.Path & "\" & WN
conn.Open
If conn.State = adStateOpen Then
    sSql = "Select 物品名称, Sum(进仓数量) As 进仓汇总 From " & TableName & _
           " Group By 物品名称 Having Sum(进仓数量) >= 10"
    Set rst = New ADODB.Recordset
    rst.Open sSql, conn, 1, 3
    For ii = 0 To rst.Fields.Count - 1
        sRan.Offset(0, ii).Value = rst.Fields(ii).Name
    Next
   
    sRan.Offset(1, 0).CopyFromRecordset rst
   
    MsgBox "成功汇总“" & TableName & "”中的记录!", , "http://excelba.com"
    conn.Close
End If
Set conn = Nothing
End Sub

同样,我们还是给出一段操作Excel文件的例子:

Sub 进销存表文件中按筛选分类汇总进仓表后的数据()
'*******************************************
'时间:2008-10-17
'作者:bengdeng
'功能:在程序文件同一目录下进销存表文件中筛选分类汇总进仓表后的数据
'注意:要在工具/引用中引用microsoft activex date objects x.x
'      其中x.x为版本号,可能会因为你安装的office的版本不同而不同,本例引用了2.5版
'发布:http://www.excelba.com
'*******************************************
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim WN As String
Dim TableName As String
Dim sSql As String
Dim xSh As Worksheet
Dim sRan As Range
Dim ii As Integer

WN = "进销存表.xls"
TableName = "进仓表"
'需要写入的工作表名称
Set xSh = ThisWorkbook.Worksheets.Add
'标题开始单元格
Set sRan = xSh.Range("A1")

Set conn = New ADODB.Connection
conn.ConnectionString = "Provider=Microsoft.Jet.Oledb.4.0;" & _
                        "Extended Properties=Excel 8.0;" & _
                        "Data Source=" & ThisWorkbook.Path & "\" & WN
conn.Open
If conn.State = adStateOpen Then
    sSql = "Select 物品名称, Sum(进仓数量) As 进仓汇总 From [" & TableName & "$] " & _
           " Group By 物品名称 Having Sum(进仓数量) >= 10"
    Set rst = New ADODB.Recordset
    rst.Open sSql, conn, 1, 3
    For ii = 0 To rst.Fields.Count - 1
        sRan.Offset(0, ii).Value = rst.Fields(ii).Name
    Next
   
    sRan.Offset(1, 0).CopyFromRecordset rst
   
    MsgBox "成功汇总“" & TableName & "”中的记录!", , "http://excelba.com"
    conn.Close
End If
Set conn = Nothing
End Sub

从上面的例子,我们应该就可以了解Having的用处了,也应该可以了解Having与Where的区别了吧。之后大家就可以复制上面的代码,然后运行看一下效果,理解一下这篇文章的内容吧。

如果你不是从第一篇 SQL语言教程 看起,你需要到http://www.excelba.com/Soft/Html/119.html 下载文件,压缩文件包含三个文件,数据库文件——进销存表.mdb与Excel文件——进销存表.xls就是保存数据的文件,而主文件.xls就是主程序文件,以后大家的代码可以添加在这个文件的新模块里,然后再运行程序代码。

文章录入:admin | 浏览次数:
相关评论(以下网友评论只代表其个人观点,不代表Excel吧的观点或立场)
相关信息

关于本站 | 留言本站 | 友情连接 | 后台管理
Copyright © 2005 - 2008 Excel吧 Inc. All Rights Reserved.
HxCms Ver9.0  闽ICP备06001689号
关闭此窗口