ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 6444|回复: 14

[已解决] sql语句求字段TOP20,高手请进

[复制链接]

TA的精华主题

TA的得分主题

发表于 2009-8-6 20:10 | 显示全部楼层 |阅读模式
如题,用SQL语言求出附件中按大分类分组后的TOP20,即每个"大分类"的销售额TOP20.

2009-8-6 求助文件.rar

43.19 KB, 下载次数: 75

TA的精华主题

TA的得分主题

发表于 2009-8-7 09:13 | 显示全部楼层
想学习sql?
去买本书吧, sql  cookbook,目前还没找到电子书,去买本吧

sql里的很多函数在excel和access里都是不支持的,所以只能用笨办法来一个一个做,
你这个题目的做法就是先检出 大类 的列表,然后按照 每个名称做一个检索,按照销售额排序,
然后检测 rst的数量,如果超过20,就只取前20,如果没有,就全部显示,稍微麻烦点

[ 本帖最后由 xinjiana 于 2009-8-7 09:25 编辑 ]

TA的精华主题

TA的得分主题

发表于 2009-8-7 14:40 | 显示全部楼层
SQL怎么弄到你这种状态,水平有限,还请高人指导。但用透视完全可以达到你的要求,具体看附件。

显示前20.rar

92.34 KB, 下载次数: 41

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-8-7 18:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

回复 3楼 nkgsm 的帖子

你这个结果不是我想要的结果呀。我想要的是每个大分类的TOP20,你现在的结果是按供应商来算的吧?

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-8-7 18:47 | 显示全部楼层
谢谢大家的回答,可是我想要的效果是用VBA语言直接从数据库里拉出数据,并得到每个大分类的TOP20。其实用VBA代码处理出每个大分类的TOP20的代码我已经写出来了,只是速度稍微差一点。我在想如果能用SQL直接处理出TOP20的结果来的话,或许能够快一点。
    前段时间看到论坛里有在查询结果里添加ID序列号的方法,我在想可不可以通过添加ID序列号,然后再添加一个ID<=20来实现,可是我的SQL学的还不到家,所以请大家帮帮忙呢。在这里先谢过了!

TA的精华主题

TA的得分主题

发表于 2009-8-7 20:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

如果非要用SQL的话,用 union all变通一下,但超过48个就不行了

Sub subgrp_top20()
    Dim Sql$
    Set conn = CreateObject("adodb.connection")
    conn.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & ThisWorkbook.FullName
    For Each c In conn.Execute("select distinct 大分类 from [source$] order by 1").getrows
        Sql = Sql & " union all select top 20 * from [source$] where 大分类=" & c & " order by 销售额 desc"
    Next c
    Sql = Right(Sql, Len(Sql) - 11)
    Sheets("Result").Range("a2").CopyFromRecordset conn.Execute(Sql)
    Sheets("Result").Activate
    conn.Close
    Set conn = Nothing
End Sub

TA的精华主题

TA的得分主题

发表于 2009-8-7 20:29 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

或者分段直接执行SQL

Sub subgrp_top20()
    Dim Sql$
    Set conn = CreateObject("adodb.connection")
    conn.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & ThisWorkbook.FullName
    For Each c In conn.Execute("select distinct 大分类 from [source$] order by 1").getrows
        Sheets("Result").Range("a65536").End(xlUp).Offset(1, 0).CopyFromRecordset conn.Execute("select top 20 * from [source$] where 大分类=" & c & " order by 销售额 desc")
    Next c
    Sheets("Result").Activate
    conn.Close
    Set conn = Nothing
End Sub

TA的精华主题

TA的得分主题

发表于 2009-8-7 20:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
导入到SQL DB后我想很容易,Excel我不会,什么vlook我都还不会用

TA的精华主题

TA的得分主题

发表于 2009-8-7 20:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
学习下
sql很强大

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-8-8 13:10 | 显示全部楼层

回复 7楼 gly1126 的帖子

6楼的运行结果是错误的,7楼运行结果正确
不过,当数据源的数据很多时(我测试的的数据有3万多条),会显示内存不足。而且我看来速度好像没有我想像的那么快。说不定我还是优化一下我的VBA代码会更实际一点。
    因为
原帖由 小蚁雄兵 于 2009-8-7 12:52 发表
ORACLE就是拽, 很多东西搞得比其他数据库语言麻烦。
ORACLE不支付TOP语句,你得用其他的办法,网上找找应该有。


    我本来打算如果能得到在EXCEL里面的SQL语句能够直接套用到ORACLE数据库查询当中直接把结果查询出来的。现在看来,如果只能把数据拉到EXCEL里再处理的话,用VBA代码直接处理或许更快一点。

[ 本帖最后由 wangjian6931 于 2009-8-8 13:27 编辑 ]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-27 17:55 , Processed in 0.050862 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表