Office中国论坛/Access中国论坛

标题: 这种字符串怎么统计啊?(已解决,感谢版主) [打印本页]

作者: ghfmac    时间: 2009-3-31 15:16
标题: 这种字符串怎么统计啊?(已解决,感谢版主)
本帖最后由 ghfmac 于 2009-4-1 08:48 编辑

附件中的表,代码字段请看例子,我想统计下每行里含有Z1的有几条记录,含有Z2的几条,这种统计怎么弄啊?[attach]37040[/attach]
作者: rjacky    时间: 2009-3-31 15:30
  1. SELECT Sum(IIf(InStr([代码],"Z1")>0,1,0)) AS 含有Z1记录数, Sum(IIf(InStr([代码],"Z2")>0,1,0)) AS 含有Z2记录数
  2. FROM 表1
复制代码

作者: ghfmac    时间: 2009-4-1 08:47
本帖最后由 ghfmac 于 2009-4-1 09:03 编辑

谢谢版主,问题解决!但是在运行中发现个新问题,如果“z1”项统计时,会把“z11”也统计进去,这是为什么,不需要加模糊查询啊?
作者: rjacky    时间: 2009-4-1 09:49
那么改成这样就可以了,不管是否有zz1还是z11等情况
  1. SELECT Sum(IIf(InStr("," & [代码] & ",",",Z1,")>0,1,0)) AS 含有Z1记录数, Sum(IIf(InStr("," & [代码] & ",",",Z2,")>0,1,0)) AS 含有Z2记录数
  2. FROM 表1
复制代码

作者: ghfmac    时间: 2009-4-1 11:14
本帖最后由 ghfmac 于 2009-4-1 11:34 编辑

非常感觉版主的热心!问题彻底解决。 如果能有点注解就好不!
作者: rjacky    时间: 2009-4-1 16:21
那么只能将问题回答到底了,先简单解释一下

在[代码]字段前后各加上一个逗号
"," & [代码] & ","   

在[代码]字段前后各加上一个逗号后,用instr()函数判断是否含有,z1,
InStr( "," & [代码] & "," ,  ",Z1," )

如果InStr()>0,就是含有,则IIf(InStr()>0,1,0)=1,否则等于0
IIf( InStr("," & [代码] & ",",",Z1,")>0  , 1 ,  0)   

含有就是1,不含有就是0,用sum()求和就是需要的结果
sum( IIf(InStr("," & [代码] & ",",",Z1,")>0,1,0) )
作者: rjacky    时间: 2009-4-1 16:31
本帖最后由 rjacky 于 2009-4-1 16:38 编辑

具体思路:

对于计算机来说,zz11也包含了z1,所以也算作一条记录,所以关键问题是要区分z1和zz11。

1、在[代码]字段中,Z1的位置有4种
在开头 z1,……
在中间 ……,z1,……
在结尾 ……z1
单一个 z1

2、同样在[代码]字段中,诸如z11或zz1的位置也有4种
在开头 zz11,……
在中间 ……,zz11,……
在结尾 ……zz11
单一个 zz11

3、1和2两者的区别是: 真正的z1前面要么是空,要么是逗号,后面要么是空,要么就是逗号,共四种情况,在查询中来处理比较复杂,即使用vba编程也得用两个if来描述

4、要一步就能找出真正的z1,就得切换角度将问题转换一下,所以无论在[代码]字段中z1的位置如何,如果在字段前后都加上逗号
在开头 ,z1,……,
在中间 ,……,z1,……,
在结尾 ,……z1,
单一个 ,z1,

5、这样 2和4的区别就非常明显了 ,z1,zz11 是两个完全不同的字符串,一步就能准确区分开来,所以问题从"是否含有z1"变成"是否含有,z1, "
作者: chaojianan    时间: 2009-4-1 16:39
学习了。
作者: ghfmac    时间: 2009-4-3 10:05
相当感谢rjacky 的讲解,菜菜们有福了!
作者: 阿六爱狗    时间: 2009-4-3 10:14
看不懂,努力学
作者: meteorxp    时间: 2009-4-9 09:15
谢谢!




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3