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