
我这里有一个报表需求,需要用 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 也不再支持了…… |