Office中国论坛/Access中国论坛

标题: 【原创 / 文章】关于多字段统计问题 [打印本页]

作者: LucasLynn    时间: 2005-10-28 02:22
标题: 【原创 / 文章】关于多字段统计问题
最近在论坛上看到好几个帖子询问有关多字段的统计问题,而且有很多人关注。

多字段问题大致上可以这样定义:数据源中的多个字段包含相同含义的数据内容,因为分类不同,所以被划分为多个字段。

其实这个问题我也曾经遇到过,当时我刚刚开始学习使用Access,因为对于各个功能都不太了解,因此为了偷懒就把多个分类使用多个字段来进行表示。到了后来需要进行统计的时候,就傻眼了。

导致这类问题的根本,在于数据表设计的不合理(或者是为了向某个其他问题妥协),合理的设计方法应该是通过两个字段:数据和数据分类来标识数据。这样设计的优点是数据逻辑清晰,后期处理便利,缺点是前期录入麻烦,用户界面编写麻烦。比方说某人的3个电话号码,如果做成三条记录,想要在一个窗体中管理此人的所有数据,就不是简单点击几下鼠标就能完成了。我想这也是大多数人采用多字段的原因吧。

问题已经发生了,重新设计数据表有时候不太现实,那么让我们来讨论一下如何解决这样的表的统计问题,下面推荐几种我当时遇到这个问题所采用的解决办法,如果其他人有更好的办法,也希望不吝于分享一下:

下列方法的数据实例如下:







ID

早餐

中餐

晚餐

夜宵

<TR>

1

包子

豆浆

烧卖

油条

<TR>

2

豆浆

包子

油条

烧卖

<TR>

3

油条

烧卖

豆浆

包子

<TR>

4

烧卖

油条

包子

豆浆

1、单列统计,最后汇总。

对于每个数据列进行单独的统计,最后合并结果。这个方法适用于相似字段较多的时候。缺点是很难进行复杂的查询。

DCount("*","表1","早餐=包子")+DCount("*","表1","中餐=包子")+DCount("*","表1","晚餐=包子")DCount("*","表1","夜宵=包子")

2、单独提取数据列,进行合并,最后统计。

将不同的数据列,通过Union的方法,在查询中合并成一个新的记录集。这个方法缺点是在记录较多的时候会产生效率问题,优点是可以进行复杂的查询。

Select ID, 早餐 AS Dinner FROM 表1

Union Select ID, 午餐 AS Dinner FROM 表1

Union Select ID, 晚餐 AS Dinner FROM 表1

Union Select ID, 夜宵 AS Dinner FROM 表1

通过上述查询合并后得到的查询结果,已经可以进行任意方式的统计了。

3、VBA代码方式统计

通过DAO或ADO遍历每一条记录,手工进行统计。适用于字段数极多的时候。

Public Function MCount(FieldFrom As Integer, Field To As Integer, FieldValue As Variant) As Long

    Dim intFieldID As Integer

    Dim adoRs As New ADODB.Recordset

    adoRs.Open "SELECT * FROM 表1", CurrentProject.Connection

    Do Until adoRs.EOF

        For intFieldID=FieldFrom To FieldTo

            If adoRs.Fields(intFieldID)=FieldValue Then MCount=MCount+1

        Next intFieldID

        adoRs.MoveNext

    Loop

End Function

[此贴子已经被作者于2005-10-27 18:22:52编辑过]


作者: quanli    时间: 2005-10-28 15:38
学习。。。
作者: fuliangshu    时间: 2005-10-28 20:47
请问总版主,上面的VBA代码怎么用啊?因为我是新手,请多赐教,谢谢!
作者: Dragxixi    时间: 2005-10-29 00:58
学习
作者: hwdavid    时间: 2007-1-26 01:51
多字段怎么转换成一列
作者: hgxsyhb    时间: 2010-3-15 16:08
学习学习。好法子




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