我这里有一个报表需求,需要用 access 算出中位数,不过 access 并没有原生提供 median 函数,所以我就找了一个用 VB 实现的自定义函数,出处是这里
Stack Overflow
Function fMedian(SQLOrTable, GroupFieldName, GroupFieldValue, MedianFieldName)
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs1 = db.OpenRecordset(SQLOrTable, dbOpenDynaset)
If IsDate(GroupFieldValue) Then
GroupFieldValue = "#" & GroupFieldValue & "#"
ElseIf Not IsNumeric(GroupFieldValue) Then
GroupFieldValue = "'" & Replace(GroupFieldValue, "'", "''") & "'"
End If
rs1.Filter = GroupFieldName & "=" & GroupFieldValue
rs1.Sort = MedianFieldName
Set rs = rs1.OpenRecordset()
rs.Move (rs.RecordCount / 2)
rs.MovePrevious
If rs.RecordCount Mod 2 = 0 Then
varMedian1 = rs.Fields(MedianFieldName)
rs.MoveNext
fMedian = (varMedian1 + rs.Fields(MedianFieldName)) / 2
Else
fMedian = rs.Fields(MedianFieldName)
End If
End Function
原表的字段如下
|结束时间年月日 |分公司 |计算时长之 First 之合计|状态 1|状态 2|日期|月份|集合|
集合=分公司&状态 1&状态 2&月份,是一个辅助列
想输出的表是这样的
|集合|时效(计算时长之 First 之合计的中位数)|
表达式如下
时效: fMedian("5-8-1 新增放款时效(按分公司)","集合",[集合],"计算时长之 First 之合计")
在 SQL 视图里看的话是这样
SELECT [5-8-1 新增放款各环节时效基础表].集合月,
fMedian("5-8-1 新增放款时效(按分公司)","集合",[集合],"计算时长之 First 之合计") AS 时效
FROM [5-8-1 新增放款各环节时效基础表]
GROUP BY [5-8-1 新增放款各环节时效基础表].集合;
但是每次运行查询的时候 access 都会提示“表达式中'fMedian'函数未定义”,试了好多次也不知道问题在哪里,求指教 /(ㄒoㄒ)/~~
1
KagamineLenKai2 OP 刚开了下 VBA 里的引用, Microsoft DAO 3.6 Object Library 没有勾选…但是勾上再点确定又会提示加载 DLL 错误……
|
2
KagamineLenKai2 OP 又搜索了一下,貌似是说 Microsoft Access 16.0 Object Library 就能支持 DAO 运行,而这个 DAO3.6 好多年前就不更新了,新版 office 也不再支持了……
|