最近在论坛上看到好几个帖子询问有关多字段的统计问题,而且有很多人关注。
多字段问题大致上可以这样定义:数据源中的多个字段包含相同含义的数据内容,因为分类不同,所以被划分为多个字段。
其实这个问题我也曾经遇到过,当时我刚刚开始学习使用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编辑过]
|