ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

SQL查询实例应用之一

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-2-26 00:03 | 显示全部楼层 |阅读模式
此题来自于本站VBA开发版的一个帖子:http://club.excelhome.net/thread-539107-1-1.html,原题请到此下载
楼主原意是要用VBA来解决问题的,看到他们的VBA代码,我的羡慕之情犹如滔滔江水,绵延不绝,但是查询和统计是我们透视表的强项,看到题就想着用透视表来解决,当然这里也有我是V白的原因吧,下面就让只会一点点透视表的我试着用透视表来解决下,也拿这个例题跟透视表版块的同仁们一起探讨下有无更好的方法解决此类问题。

SQL代码:
SELECT T3.出险件数, T3.续保台数, (T4.上月合计 - T3.续保台数) AS 丢失台数
FROM (SELECT SUM(IIF(RIGHT(T1.号牌号码,1)='挂',IIF(T1.号牌号码=T2.号牌号码,1,0),IIF(RIGHT(T1.发动机号,6)=RIGHT(T2.发动机号,6),1,0))) AS 续保台数, T1.出险件数
FROM [Sheet1$] T1, [Sheet2$] T2 GROUP BY T1.出险件数) T3, (SELECT COUNT(T1.号牌号码) AS 上月合计, T1.出险件数
FROM [Sheet1$] T1 GROUP BY T1.出险件数) T4
WHERE T3.出险件数=T4.出险件数

拿到此类题目,首先要做的事情是数据源的规范,去除空格以及不可见字符,删除空白行和空白列,然后去掉所有单元格格式的对齐方式,观察数据是否统一,这里楼主的车牌号和发动机号是混合文本和数值的,虽然我们可以在SQL语句中使用兼容,但先统一数据为文本格式对我们调试SQL语句更为方便,不容易出错。所以先使用分列转换格式为文本,至此,数据源的规范化完成。

下面分析楼主的题意和需求。估计是楼主不太了解透视表的原因,把那个流程图,做的N复杂,不过好歹也是说明白了。我理解后把题意简化了下,意思是号牌号码中带“挂”字的,只要Sheet1和Sheet2表中的车号相同,就是续保,不带“挂”字的,虽然楼主说了N多判断方式,但只要是发动机号最后六位相同,就是续保,而最后统计是按“出险件数”进行分组。

理解题意后,SQL语句也就并不复杂,其重点是把Sheet1中的每条记录按是否续保在Sheet2中进行查询,按“出险件数”进行分组,用了两个函数,IIF和RIGHT,IIF(RIGHT(T1.号牌号码,1)='挂',IIF(T1.号牌号码=T2.号牌号码,1,0),IIF(RIGHT(T1.发动机号,6)=RIGHT(T2.发动机号,6),1,0)),很容易理解,首先判断“号牌号码”中最后一位是否等于“挂”,如果是看Sheet1号牌号码是否等于Sheet2号牌号码,是则返回1,否则返回;如果没有“挂”,如果发动机号后六位相等则返回1,否则返回0,然后按“出险件数”分组求和。这个函数再解释就有点那个了......
丢失台数的查询,应该有更好的办法,我是用Sheet1按“出险件数”分组后减去“续保台数”,估计大家有更好的办法。

下面是我所做结果,欢迎大家指正。

实例.rar (8.72 KB, 下载次数: 603)

[ 本帖最后由 pc520 于 2010-2-26 00:33 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2010-2-26 09:05 | 显示全部楼层
在VBA版看到楼主用数据透视表完美的解决了这个问题,让只会一点点透视表的我,我的羡慕之情犹如滔滔江水,绵延不绝。
楼主是Excel的高手啊。

TA的精华主题

TA的得分主题

发表于 2010-2-26 12:05 | 显示全部楼层
我也正在学数据透视表,看完楼主的代码后,更想学了!
支持一下!呵呵

TA的精华主题

TA的得分主题

发表于 2010-2-26 12:46 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-2-26 13:17 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-2-26 16:26 | 显示全部楼层
试试下面的语句:
  1. SELECT (SELECT COUNT(*) FROM [SHEET2$A:E]) AS 当月承保总台数,(SELECT COUNT(*) FROM [SHEET1$A:F]) AS 当月到期台数,IIF(ISNULL(T2.保单号),"丢失","续保") AS 续保与否,T1.* FROM [Sheet1$A:F] T1 LEFT JOIN [SHEET2$A:E] T2 ON ((T1.号牌号码 LIKE '%挂' AND T1.号牌号码=T2.号牌号码) OR (NOT T1.号牌号码 LIKE '%挂' AND RIGHT(T1.发动机号,6)=RIGHT(T2.发动机号,6)))
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-2-26 19:14 | 显示全部楼层
哈哈,果然有所收获,楼上老师的代码比较强,我代为解释下:
正常我们用到的多表连接查询,其连接关系一般多为=<>之类的简单连接,在老师的代码中,可以看到,连接多表也可以用到复杂的逻辑判断。
Snap2.jpg

TA的精华主题

TA的得分主题

发表于 2010-2-26 21:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
下载学习!

TA的精华主题

TA的得分主题

发表于 2010-2-26 23:26 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-2-26 23:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
楼主的钻探精神非常强,赞一个!
标记,待研究。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-11 02:37 , Processed in 0.038002 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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