Office中国论坛/Access中国论坛
标题: wuaza老兄进来看一下~~~~~~~~~~~ [打印本页]
作者: vickygp 时间: 2006-2-10 01:40
标题: wuaza老兄进来看一下~~~~~~~~~~~
表一(姓名,a1)其中a1是多选题有如下几个选项01、获取国内外新闻,02、了解政府法规,03、交友,04、表达个人感情,05、消磨时间
表中数据有以下几条(张三,010204)(李四,02030405)(王五,0104)
现想从表一中汇总结果的到a1题每个选项共有几人选择,如何来做呢?请高手们帮忙
[此贴子已经被作者于2006-4-15 17:37:37编辑过]
作者: wuaza 时间: 2006-2-10 02:39
用参数查询
SELECT Count(*) AS 人数
FROM t
WHERE (((t.a1) Like "*" & [请输入需统计的选项] & "*"));
每次查询完后按shift+F9可继续查询。
如果想一次性统计就
SELECT "01" as 选项 ,Count(*) AS 人数
FROM t
WHERE a1 Like "*01*"
union
SELECT "02" as 选项 ,Count(*) AS 人数
FROM t
WHERE a1 Like "*02*"
union
SELECT "03" as 选项 ,Count(*) AS 人数
FROM t
WHERE a1 Like "*03*"
union
SELECT "04" as 选项 ,Count(*) AS 人数
FROM t
WHERE a1 Like "*04*"
[此贴子已经被作者于2006-2-9 18:56:18编辑过]
作者: vickygp 时间: 2006-2-10 19:22
非常感谢,我头疼了好久了~~~[em01],谢谢wuaza
作者: vickygp 时间: 2006-2-10 20:22
新问题出现了,如果我的选项超过10个,比如16个,那么对选项10的统计就不准确了,他会把选择010210中的"010"也算作10来统计,怎么解决呢
作者: wuaza 时间: 2006-2-11 18:51
首先创建一个函数
Public Function fillarray(fd As String) As String
Dim m As Integer
m = Len(fd) / 2 - 1
ReDim cur(m) As String
Dim intI As Integer
For intI = 0 To m
cur(intI) = Mid(fd, 2 * intI + 1, 2)
Next
fillarray = Join(cur())
End Function
然后在查询中调用该函数
SELECT Count(*) AS 人数
FROM t
WHERE fillarray([a1]) Like "*" & [请输入需统计的选项] & "*"
作者: vickygp 时间: 2006-2-13 18:45
wuaza兄,我上穿了附件,麻烦你帮我修改一下,我对函数实在是不太会,拜托了。另外,这个联合查询能不能优化些呢?我在表中一共有5道多选题,分别是关于广播、电视、报纸、杂志、互联网的选择汇总,我想把这5道题的答案都用一个查询汇总出来,但我用你交我的方法汇了两道题的答案,汇第三道题的答案时,系统提示我查询过于复杂,有好方法解决吗?急切盼望回复~~~~
[attach]15793[/attach]
[此贴子已经被作者于2006-2-13 11:15:52编辑过]
作者: wuaza 时间: 2006-2-13 20:36
你的表最好先转换成便于统计的形式,你现在的表结构很不利于单个选项的统计。我做了个dao过程,可是不幸的是电脑被算死了。
首先建一个表b,字段为n_wjbh,媒体,选项
Public Sub ss()
Dim i, j As Integer
Dim rs As DAO.Recordset
Dim rs1 As DAO.Recordset
CurrentDb.OpenRecordset "t"
CurrentDb.OpenRecordset "b"
Do Until rs.EOF
rs.MoveFirst
For i = 2 To rs.Fields.Count
For j = 0 To Len(rs("a4_1")) / 2 - 1
rs1.AddNew
rs1("n_wjbh") = rs("n_wjbh")
rs1(2) = "a4_" & (i - 1)
rs1(3) = Mid(rs(i), 2 * j + 1, 2)
Next
Next
rs.MoveNext
Loop
End Sub
我再想想用操作查询能否生成这个表b
作者: vickygp 时间: 2006-2-13 22:59
辛苦wuaza兄了,我开始也想把它拆分成便于统计的格式,但我现在上传的表只是完整表的一部分,如果要把所有多选题都拆分成单项的话,access表没有这么多字段可以容纳,唉~~头疼阿。帮我想象解决办法把。
作者: vickygp 时间: 2006-2-14 18:40
被挤到后面去了,自己顶一下,高手们帮我看一下阿~~~急啊,不要不理我[em06]
作者: wuaza 时间: 2006-2-14 20:40
考虑到速度问题,选项还是由参数输入,一个一个统计吧,你看看这样行吗?
SELECT [输入选项] as 选项 ,"a4_1" as 媒体,Count(*) AS 人数
FROM t
WHERE fill(nz([a4_1],"00")) Like "*"&[输入选项]&"*"
union
SELECT [输入选项] as 选项 ,"a4_2" as 媒体,Count(*) AS 人数
FROM t
WHERE fill(nz([a4_2],"00")) Like "*"&[输入选项]&"*"
union
SELECT [输入选项] as 选项 ,"a4_3" as 媒体,Count(*) AS 人数
FROM t
WHERE fill(nz([a4_3],"00")) Like "*"&[输入选项]&"*"
union
SELECT [输入选项] as 选项 ,"a4_4" as 媒体,Count(*) AS 人数
FROM t
WHERE fill(nz([a4_4],"00")) Like "*"&[输入选项]&"*"
union
SELECT [输入选项] as 选项 ,"a4_5" as 媒体,Count(*) AS 人数
FROM t
WHERE fill(nz([a4_5],"00")) Like "*"&[输入选项]&"*"
fill函数如下
Public Function fill(fd As String) As String
Dim m As Integer
m = Len(fd) / 2 - 1
ReDim cur(m) As String
Dim intI As Integer
For intI = 0 To m
cur(intI) = Mid(fd, 2 * intI + 1, 2)
Next
fill = Join(cur())
End Function
[attach]15819[/attach]
[此贴子已经被作者于2006-2-14 12:42:32编辑过]
作者: vickygp 时间: 2006-2-15 00:38
标题: wuaza老兄进来看一下
谢谢老兄了,我现在正在调问卷,尽量把多选题控制在10个选项以内,这样汇总错误的情况就能避免了。今天网速好卡,我下载你给我的附件用了块半个小时了,晕
[此贴子已经被作者于2006-4-15 17:32:40编辑过]
作者: wuaza 时间: 2006-2-15 00:44
我那个函数可以避免你说的错误的,你尽管用好了。还有,你的表最好设计成这样:
姓名 题号 选项
张三 1 02
张三 1 03
张三 2 03
这样用汇总查询就很好做了。
作者: vickygp 时间: 2006-4-16 00:52
wuaza兄,以上的问题我已经都解决了,谢谢,之前请教你的多选题都是010203这样的两位的选项,如果是想统计1234567这样的一位的多选题,怎么处理?我还按照上面的方法试了试,但有的选项统计出来得数据不准确,帮我看看吧
作者: LucasLynn 时间: 2006-4-16 01:20
一、常规办法
建立关联表
二、特殊办法
使用二进制位来表示每个答案的选择与否。
作者: vickygp 时间: 2006-4-17 01:01
问卷编号
选项
1
123
2
124
3
123456
4
1467
5
237
表一,我想统计选择1 的有多少问卷,选择2的有多少,以此类推[attach]17186[/attach]
请帮我看一下
作者: vickygp 时间: 2006-4-17 01:05
表一,我想统计选择1 的有多少问卷,选择2的有多少,以此类推
请帮我看一下[attach]17187[/attach]
欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) |
Powered by Discuz! X3.3 |