【问题标题】:Access Query Average Numbers by Row按行访问查询平均数
【发布时间】:2020-02-29 01:45:34
【问题描述】:

我有一张表格,其中包含不同的项目、参与项目的人员以及他们的年级。

我正在尝试编写一个访问查询,该查询将根据项目给出平均成绩。

但我不知道如何获得平均成绩。
如下表所示。

【问题讨论】:

    标签: ms-access


    【解决方案1】:

    没有用于聚合记录字段的内在函数。要平均,必须添加字段并除以数据元素的数量:(field1 + field2 + field3 + field4 + field5)/5。引入了复杂性,因为并非所有字段都有数据,因此分母不是静态的。 VBA 自定义函数可以处理这个问题。

    Function RAvg(ParamArray FieldValues()) As Variant
    '----------------------------------------------------
    ' Function RAvg() averages all numeric arguments passed to it.
    ' If none of the arguments are numeric, it returns null.
    '-----------------------------------------------------
    Dim dblTotal As Double
    Dim lngCount As Long
    Dim varArg As Variant
    For Each varArg In FieldValues
       If IsNumeric(varArg) Then
          dblTotal = dblTotal + varArg
          lngCount = lngCount + 1
       End If
    Next
    If lngCount > 0 Then
       RAvg = dblTotal / lngCount
    Else
       RAvg = Null
    End If
    End Function
    

    从查询调用函数:

    SELECT Project, RAvg([Stage 1 Grade], [Stage 2 Grade], [Stage 3 Grade], [Stage 4 Grade], [Stage 5 Grade]) AS AvgGrade FROM Projects;

    另一种方法是规范化数据结构,然后构建聚合查询。 UNION 查询可以将字段重新排列为规范化的数据结构。 UNION 不允许重复记录。使用 UNION ALL 提取所有数据,即使它重复。 UNION 没有查询设计器或向导,必须输入查询生成器的 SQLView。

    SELECT Project, [Stage 1 person] AS Person, [Stage 1 grade] AS Grade, "S1" AS Stage FROM Projects
    UNION ALL SELECT Project, [Stage 2 person], [Stage 2 grade], "S2" FROM Projects
    UNION ALL SELECT Project, [Stage 3 person], [Stage 3 grade], "S3" FROM Projects
    UNION ALL SELECT Project, [Stage 4 person], [Stage 4 grade], "S4" FROM Projects
    UNION ALL SELECT Project, [Stage 5 person], [Stage 5 grade], "S5" FROM Projects;
    

    现在将该查询用作使用 Avg() 函数的聚合 (GROUP BY) 查询的源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 1970-01-01
      • 2017-08-05
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 2016-08-16
      相关资源
      最近更新 更多