【发布时间】:2020-02-29 01:45:34
【问题描述】:
【问题讨论】:
标签: ms-access
【问题讨论】:
标签: ms-access
没有用于聚合记录字段的内在函数。要平均,必须添加字段并除以数据元素的数量:(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) 查询的源。
【讨论】: