|
此题来自于本站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
查看全部评分
-
|