分享

SQL中Top与Order结合使用的问题 | VBA实例教程

 gblhp 2015-02-16

除非注明,文章均为 战战如疯 原创,转载请保留链接: http://www./cat4/509.html,VBA交流群273624828。

在之前关于SQL的知识中我们讲过要提前记录的前n条的话可以用Top命令,如果要对提取出来的数据进行排序可以用Order by,那么如果我们要从一批数据里面提取出前n大的数据自然就想到了先用Order by对数据进行排序,然后再从排好的数据中取出前n条就可以了。那下面我们来看个例子,有如下一个表

paiming

现在我们要从中取出前3名,显然这里有4个99,那我们只要取任意3个99就可以了,看我下面写的代码

Sub search()
Dim cnn As Object, sql$, rs As Object, i, n
Range("E1").CurrentRegion.Offset(1, 0).ClearContents
Set cnn = CreateObject("adodb.connection")
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=excel 12.0;Data Source=" & ThisWorkbook.FullName
sql = "select top 3 姓名,数学 from [Sheet1$A1:B11] order by 数学 desc"
Set rs = cnn.Execute(sql)
Sheet1.[E2].CopyFromRecordset rs
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub

上面的代码看上去没有什么问题,运行一下结果如下

result1

结果是4个,不是我们所预料的3个,显然我们的SQL语句与我们理解的有差别。之所以会出现这样的问题是因为我们将Top与Order结合用了,当两者结合用的时候Top n就不是指前n条了,而成了前n名了。那这个名次怎么排的呢?很简单,原表中4个99分的排名都是1,5个1分的排名都是5,没有2、3、4名,最低分0的排名是10,没有6、7、8、9名。所以如果你取top1、top2、top3或者top4得到的都是4个排名1的数据,如果你取top5、top6、top7、top8或top9那得到的就是排名1和排名5的一共9个数据。例如top9取前9名那就是第1名4个,2、3、4名0个,第5名5个,6、7、8、9名0个,加起来是9个了。

那如果我就是想取前n个数据而不是前n名,那怎么办?很简单,看下面的代码

Sub search()
Dim cnn As Object, sql$, rs As Object, i, n
Range("E1").CurrentRegion.Offset(1, 0).ClearContents
Set cnn = CreateObject("adodb.connection")
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=excel 12.0;Data Source=" & ThisWorkbook.FullName
sql = "select 姓名,数学 from [Sheet1$A1:B11] order by 数学 desc"
sql = "select top 3 * from (" & sql & ")"
Set rs = cnn.Execute(sql)
Sheet1.[E2].CopyFromRecordset rs
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub

上面的代码运行一下得到的结果就是3个数据,这个sql语句包括了两部分,先用"select 姓名,数学 from [Sheet1$A1:B11] order by 数学 desc"形成一个降序排列的查询,然后我们再从这个查询中取top 3,所以这里top语句的结构就成了“select top * from [table]”,也就没有了order by的问题了,所以最后我结果就是实实在在的前3行数据。

本节示例文件下载:http://pan.baidu.com/s/1pJsieYf

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多