设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 2073|回复: 15
打印 上一主题 下一主题

[与其它组件] wuaza老兄进来看一下~~~~~~~~~~~

[复制链接]
跳转到指定楼层
1#
发表于 2006-2-10 01:40:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
表一(姓名,a1)其中a1是多选题有如下几个选项01、获取国内外新闻,02、了解政府法规,03、交友,04、表达个人感情,05、消磨时间

表中数据有以下几条(张三,010204)(李四,02030405)(王五,0104)

现想从表一中汇总结果的到a1题每个选项共有几人选择,如何来做呢?请高手们帮忙


[此贴子已经被作者于2006-4-15 17:37:37编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2006-2-10 02:39:00 | 只看该作者
用参数查询

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编辑过]

3#
 楼主| 发表于 2006-2-10 19:22:00 | 只看该作者
非常感谢,我头疼了好久了~~~[em01],谢谢wuaza
4#
 楼主| 发表于 2006-2-10 20:22:00 | 只看该作者
新问题出现了,如果我的选项超过10个,比如16个,那么对选项10的统计就不准确了,他会把选择010210中的"010"也算作10来统计,怎么解决呢
5#
发表于 2006-2-11 18:51:00 | 只看该作者
首先创建一个函数

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 "*" & [请输入需统计的选项] & "*"
6#
 楼主| 发表于 2006-2-13 18:45:00 | 只看该作者
wuaza兄,我上穿了附件,麻烦你帮我修改一下,我对函数实在是不太会,拜托了。另外,这个联合查询能不能优化些呢?我在表中一共有5道多选题,分别是关于广播、电视、报纸、杂志、互联网的选择汇总,我想把这5道题的答案都用一个查询汇总出来,但我用你交我的方法汇了两道题的答案,汇第三道题的答案时,系统提示我查询过于复杂,有好方法解决吗?急切盼望回复~~~~




[此贴子已经被作者于2006-2-13 11:15:52编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
7#
发表于 2006-2-13 20:36:00 | 只看该作者
你的表最好先转换成便于统计的形式,你现在的表结构很不利于单个选项的统计。我做了个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
8#
 楼主| 发表于 2006-2-13 22:59:00 | 只看该作者
辛苦wuaza兄了,我开始也想把它拆分成便于统计的格式,但我现在上传的表只是完整表的一部分,如果要把所有多选题都拆分成单项的话,access表没有这么多字段可以容纳,唉~~头疼阿。帮我想象解决办法把。
9#
 楼主| 发表于 2006-2-14 18:40:00 | 只看该作者
被挤到后面去了,自己顶一下,高手们帮我看一下阿~~~急啊,不要不理我[em06]
10#
发表于 2006-2-14 20:40:00 | 只看该作者
考虑到速度问题,选项还是由参数输入,一个一个统计吧,你看看这样行吗?

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



[此贴子已经被作者于2006-2-14 12:42:32编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-6-6 04:12 , Processed in 0.082050 second(s), 34 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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