Office中国论坛/Access中国论坛

标题: 关于平均值的问题 [打印本页]

作者: lhsh    时间: 2007-12-3 13:42
标题: 关于平均值的问题
如何根据被考核人和考项这两个条件求各项成绩的平均值当每个人的考项的个数大于0,求平均,大于19,求减去一个最大和最小后的平均值,大于39,求减去2个最大和最小后的平均值,大于59,求减去3个最大和最小后的平均值,大于79,求减去4个最大和最小后的平均值,请帮忙,谢谢[attach]27077[/attach]
作者: Victor_Duane    时间: 2007-12-3 13:56
怎么下载不了啊,怪了,这是一个好问题也
作者: Victor_Duane    时间: 2007-12-3 17:10
在你的数据表中建立一个自动编号的字段(ID),新建一个表tblcal(id,数字,long)

你的数据表中的字段名需要修改一下太长的空格了([工作能力                      及方法])
另外你可以看查询与子过程了

[attach]27083[/attach]
作者: lhsh    时间: 2007-12-3 19:18
要的是根据条件按列计算平均值,不是按行计算,谢谢你
作者: lhsh    时间: 2007-12-3 19:47
1个被考核人有三个考项,每一个考项分类按项目求平均数
作者: Victor_Duane    时间: 2007-12-3 19:57
列的计算出来了,行的我只是算一下总分
我把你要的数据筛选出来,其余的你自己完成了
因为你要一个最大值,我就算出一个最大值,
你要是单独一项的最大值与最小值要筛选的话,那就要分成几个来做了
不过这些过程还是用得上的

[ 本帖最后由 Victor_Duane 于 2007-12-3 20:01 编辑 ]
作者: andymark    时间: 2007-12-3 20:30
上传例子,也要有代表性,全部一个名字,表述不清,实在是爱莫能助
把最终的结果贴出来
作者: Victor_Duane    时间: 2007-12-3 20:33
呵呵,有两种方法可以实现
一是用刚才那个过程一个一个的项目写入每个项目的表中
然后用联合查询与汇总查询拼装
二是直接写入一个表中,但要同时开这些子项的记录集,内存消耗量比较大
作者: Victor_Duane    时间: 2007-12-3 20:37
我个人的建议是在窗体里每个子项就建一个按钮,然后得出每项的有效数据,
最后建一个按钮打开,这个汇总出来的查询
不过我写的那个过程里还需要有一点点的修改
你的想法很复杂,我个人的认为是每条记录的总分的最大值与最小值比较方便计算
作者: andymark    时间: 2007-12-3 21:50
按题意楼主要求是按列平均,不是按行统计

被考核人员   考项        工作责任心   敬业精神  ......
陈立永       集团领导      平均值     平均值    .......
陈立永       中层管理      平均值     平均值    ......
陈立永       部门群众      平均值     平均值    ......

是这样的结果?
作者: Victor_Duane    时间: 2007-12-3 22:19
建一个新表tblcalfliter,然后运行aexcuteevents,我前面给你的查询不要删除,

然后你自己做一个查询,得出这个表里的平均值
Sub aExcuteEvents()
CurrentProject.Connection.Execute "delete * from tblcalfliter"
Dim rsyg As New ADODB.Recordset
rsyg.Open "qrykxcount", CurrentProject.Connection, 1, 2
Do While Not rsyg.EOF
goFindrec rsyg("被考核人员"), rsyg("考项"), "中层", "tblCalFliter"
rsyg.MoveNext
Loop

End Sub

Sub goFindrec(strXm As String, strKx As String, TblName As String, AddSql As String)

Dim rs As New ADODB.Recordset
Dim rs1 As New ADODB.Recordset
Dim rs2 As New ADODB.Recordset
Dim rs3 As New ADODB.Recordset
Dim rs4 As New ADODB.Recordset
Dim rs5 As New ADODB.Recordset
Dim rs6 As New ADODB.Recordset
Dim rs7 As New ADODB.Recordset
Dim rs8 As New ADODB.Recordset
Dim rs9 As New ADODB.Recordset


Dim fld(9) As String
Dim sql(9) As String
fld(0) = "工作责任心"
fld(1) = "敬业精神"
fld(2) = "执行力度"
fld(3) = "积极主动"
fld(4) = "办事公道"
fld(5) = "廉洁自律"
fld(6) = "创新精神"
fld(7) = "全局观念"
fld(8) = "团结协作意识"
fld(9) = "工作能力及方法"

Dim strCri As String
strCri = "[被考核人员]='" & strXm & "' and [考项]='" & strKx & "'"
Debug.Print strCri
Dim intKxCount As Integer
intKxCount = DCount("考项", "中层", strCri)
Debug.Print "被考核人员的考项数:" & intKxCount



sql(0) = "select " & fld(0) & " from " & TblName & " where " & strCri & " order by " & fld(0)
sql(1) = "select " & fld(1) & " from " & TblName & " where " & strCri & " order by " & fld(1)
sql(2) = "select " & fld(2) & " from " & TblName & " where " & strCri & " order by " & fld(2)
sql(3) = "select " & fld(3) & " from " & TblName & " where " & strCri & " order by " & fld(3)
sql(4) = "select " & fld(4) & " from " & TblName & " where " & strCri & " order by " & fld(4)
sql(5) = "select " & fld(5) & " from " & TblName & " where " & strCri & " order by " & fld(5)
sql(6) = "select " & fld(6) & " from " & TblName & " where " & strCri & " order by " & fld(6)
sql(7) = "select " & fld(7) & " from " & TblName & " where " & strCri & " order by " & fld(7)
sql(8) = "select " & fld(8) & " from " & TblName & " where " & strCri & " order by " & fld(8)
sql(9) = "select " & fld(9) & " from " & TblName & " where " & strCri & " order by " & fld(9)



rs.Open sql(0), CurrentProject.Connection, 1, 2
rs1.Open sql(1), CurrentProject.Connection, 1, 2
rs2.Open sql(2), CurrentProject.Connection, 1, 2
rs3.Open sql(3), CurrentProject.Connection, 1, 2
rs4.Open sql(4), CurrentProject.Connection, 1, 2
rs5.Open sql(5), CurrentProject.Connection, 1, 2
rs6.Open sql(6), CurrentProject.Connection, 1, 2
rs7.Open sql(7), CurrentProject.Connection, 1, 2
rs8.Open sql(8), CurrentProject.Connection, 1, 2
rs9.Open sql(9), CurrentProject.Connection, 1, 2



Debug.Print "记录集的记录数:" & rs.RecordCount

    Dim i As Integer
    Dim j As Integer

    Select Case intKxCount
        Case Is <= 19
        j = 0
        Case Is <= 39
        j = 1
        Case Is <= 59
        j = 2
        Case Is <= 79
        j = 3
        Case Is > 79
        j = 4
    End Select
    Debug.Print "筛除记录数:" & j & "×2"

Dim rsCal As New ADODB.Recordset



rsCal.Open AddSql, CurrentProject.Connection, 1, 2

rs.Move j
rs1.Move j
rs2.Move j
rs3.Move j
rs4.Move j
rs5.Move j
rs6.Move j
rs7.Move j
rs8.Move j
rs9.Move j


For i = 1 To intKxCount - j * 2

    rsCal.AddNew
    rsCal("被考核人员") = strXm
    rsCal("考项") = strKx
    rsCal(fld(0)) = rs(fld(0))
    rsCal(fld(1)) = rs1(fld(1))
    rsCal(fld(2)) = rs2(fld(2))
    rsCal(fld(3)) = rs3(fld(3))
    rsCal(fld(4)) = rs4(fld(4))
    rsCal(fld(5)) = rs5(fld(5))
    rsCal(fld(6)) = rs6(fld(6))
    rsCal(fld(7)) = rs7(fld(7))
    rsCal(fld(8)) = rs8(fld(8))
    rsCal(fld(9)) = rs9(fld(9))
    rsCal.Update
   
    rs.MoveNext
    rs1.MoveNext
    rs2.MoveNext
    rs3.MoveNext
    rs4.MoveNext
    rs5.MoveNext
    rs6.MoveNext
    rs7.MoveNext
    rs8.MoveNext
    rs9.MoveNext
      
Next i
End Sub
作者: Victor_Duane    时间: 2007-12-3 22:26
[attach]27088[/attach]
传上示例看是明白一点,是不是这样的
作者: Victor_Duane    时间: 2007-12-3 22:35
如果你写了ID字段的话,这里更新一下,加上一句
    rsCal("id") = rs.AbsolutePosition
这样就知道一批记录是否有筛除,如果没有筛除的话是从1开始
如果筛除了就会从开始的记录数写入,看的时候也可以大概知道
这批记录被除去了多少记录
当然在立即窗体中,也可以看到各批数据的信息

For i = 1 To intKxCount - j * 2

    rsCal.AddNew
    rsCal("id") = rs.AbsolutePosition
    rsCal("被考核人员") = strXm
    rsCal("考项") = strKx
    rsCal(fld(0)) = rs(fld(0))
    rsCal(fld(1)) = rs1(fld(1))
    rsCal(fld(2)) = rs2(fld(2))
    rsCal(fld(3)) = rs3(fld(3))
    rsCal(fld(4)) = rs4(fld(4))
    rsCal(fld(5)) = rs5(fld(5))
    rsCal(fld(6)) = rs6(fld(6))
    rsCal(fld(7)) = rs7(fld(7))
    rsCal(fld(8)) = rs8(fld(8))
    rsCal(fld(9)) = rs9(fld(9))
    rsCal.Update
   
    rs.MoveNext
    rs1.MoveNext
    rs2.MoveNext
    rs3.MoveNext
    rs4.MoveNext
    rs5.MoveNext
    rs6.MoveNext
    rs7.MoveNext
    rs8.MoveNext
    rs9.MoveNext
      
Next i
End Sub

[ 本帖最后由 Victor_Duane 于 2007-12-3 22:37 编辑 ]
作者: lhsh    时间: 2007-12-3 22:45
原帖由 cuxun 于 2007-12-3 20:17 发表
说实话,你讲得不是很清楚我做了个例子你看看


你好!我是新手,怎样操作,请指教
作者: lhsh    时间: 2007-12-3 22:56
是这个结果,但是是不是每一项都减去最大值和最小值,也有可能它们不再一行
作者: Victor_Duane    时间: 2007-12-3 23:03
[attach]27089[/attach]
这是整理过的,打开窗体1运行那个按钮就可以得到你需要的,我都是每项按你的要求来取舍数据的
作者: Victor_Duane    时间: 2007-12-3 23:05
每一次运行都会先删除临时表tblcalfliter表内的数据
然后再进行取按要求筛选的值
作者: lhsh    时间: 2007-12-4 00:33
每个人每类考项中每项(比如工作责任心、敬业精神等)减去最大数和最小数后取平均值,比如说在第二行工作责任心最大,但是敬业精神却是最小,咋办,请指教
作者: Victor_Duane    时间: 2007-12-4 12:04
我的示例已经帮你解决了啊
最后一个示例,你看一下
就是按你的要求做的,不过顺序被我调整了一下,我想不会影响的吧
作者: lhsh    时间: 2007-12-4 13:07
谢谢,   很好
作者: Victor_Duane    时间: 2007-12-4 13:11
搞定就好,这样的问题挺有价值的
作者: lhsh    时间: 2007-12-4 19:22
原帖由 Victor_Duane 于 2007-12-4 13:11 发表
搞定就好,这样的问题挺有价值的


再请教一个问题,如何让其自动运行?
作者: lhsh    时间: 2007-12-4 21:43
原帖由 cuxun 于 2007-12-3 23:43 发表
好奇,可不可以说清楚一下你到底想要什么结果呀


再再请教一个问题,如何让其自动运行?
作者: lhsh    时间: 2007-12-5 12:53
数据多,计算有点慢,能不能再快点?
作者: cg1    时间: 2007-12-5 18:04
好久没回来了,今天是一个朋友拖过来的

我的思路是判断项目后用内置函数实现,不跑 MoveNext

代码类似:
davg("项目","表","项目<dmax(项目) and 项目>dmin(项目)")
只用一个函数,类似这样,不过不知道是否可行

呵呵,我只搞思路,具体实现就靠这里的高手来了
作者: lhsh    时间: 2007-12-5 19:48
原帖由 cg1 于 2007-12-5 18:04 发表
好久没回来了,今天是一个朋友拖过来的

我的思路是判断项目后用内置函数实现,不跑 MoveNext

代码类似:
davg("项目","表","项目dmin(项目)")
只用一个函数,类似这样,不过不知道是否可行

呵呵,我只搞思 ...


如果是减去两个或三个最大和最小值,用这个可能不行吧?
作者: andymark    时间: 2007-12-5 20:13
查询可以实现,但要整合在一个查询里就比较复杂
作者: lhsh    时间: 2007-12-6 21:33
各位大侠,能不能提高速度?
作者: andymark    时间: 2007-12-6 23:50
示例是可以再优化,问题是大家对你的要求都不是很清楚
何为最大值,示例中有多于一个的最大值,全部扣掉吗
作者: lhsh    时间: 2007-12-8 06:44
原帖由 andymark 于 2007-12-6 23:50 发表
示例是可以再优化,问题是大家对你的要求都不是很清楚
何为最大值,示例中有多于一个的最大值,全部扣掉吗

根据条件,最大最小各减去5%后取平均值
作者: Victor_Duane    时间: 2007-12-8 09:39
无法洞悉你处理事务的环境,所以只好生搬硬套你的要求了,我想不出更好的解决方法
作者: lhsh    时间: 2007-12-8 09:59
如何根据被考核人和考项这两个条件求各项成绩的平均值当每个人的考项的个数大于0,求平均,大于19,求减去一个最大和最小后的平均值,大于39,求减去2个最大和最小后的平均值,大于59,求减去3个最大和最小后的平均值,大于79,求减去4个最大和最小后的平均值,
作者: lhsh    时间: 2007-12-22 21:08
:handshake
作者: cliv    时间: 2007-12-23 04:58
Very good but how download




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