John R. Porter
j.r.porter at strath.ac.uk
Fri Nov 7 04:19:40 CST 2003
This can also be done (faster I expect) by a SQL statement without coding
and ADO or DAO as the case may be, though the SQL is quite complex. If you
can get hold of it, there's an excellent article about this in the May 2003
issue of 'Smart Access' magazine. You can get a trial subscription at
http://www.pinpub.com/html/main.isx?sub=29
John R. Porter
I.T. Services
University of Strathclyde
Faculty of Education
76 Southbrae Drive
Glasgow
G13 1PP
e-mail: j.r.porter at strath.ac.uk
Tel. 0141 950 3289
-----Original Message-----
From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com]On Behalf Of Gustav Brock
Sent: 07 November 2003 09:30
To: Access Developers discussion and problem solving
Subject: Re: [AccessD] Median Number
Hi Reuben
> Anyone have a good way to find the median value in a table of unkown
number
> of records?
You could look up our own list at 2001-03-06:
<quote>
Sub GetTableMedian ()
Dim dblMedian As Double
dblMedian = GetTableMedian ("", "tblData", "FieldName")
Debug.Print (dblMedian)
End Sub
Function GetTableMedian(strDatabase As String, strTable As String, strField
As String) As Double
'strDatabase - name of the database to look in or "" for the current
database
'strTable - name of the table to analyze
'strField - name of the field to analyze
'Returns: median
Dim dbsTemp As Database
Dim rstTemp As Recordset
Dim strSQL As String
Dim lngElements As Long
Dim lngIndex As Long
Dim fInterpolate As Boolean
Dim dblMedian As Double
If strDatabase = "" Then
Set dbsTemp = CurrentDb()
Else
Set dbsTemp = DBEngine.Workspaces(0).OpenDatabase(strDatabase)
End If
strSQL = "SELECT DISTINCTROW [" & strField & "] FROM [" & strTable & "] "
strSQL = strSQL & "WHERE ([" & strField & "] Is Not Null) "
strSQL = strSQL & "ORDER BY [" & strField & "];"
Set rstTemp = dbsTemp.OpenRecordset(strSQL)
If Not rstTemp.EOF Then
rstTemp.MoveLast
lngElements = rstTemp.RecordCount
If lngElements = 1 Then
dblMedian = rstTemp(strField)
Else
lngIndex = Int((lngElements + 1) / 2)
fInterpolate = (lngElements Mod 2 = 0)
rstTemp.MoveFirst
rstTemp.Move (lngIndex - 1)
dblMedian = rstTemp(strField)
If fInterpolate Then
rstTemp.MoveNext
dblMedian = (dblMedian + rstTemp(strField)) / 2
End If
End If
Else
dblMedian = 0
End If
rstTemp.Close
dbsTemp.Close
GetTableMedian = dblMedian
End Function
William Hindman
</quote>
/gustav
_______________________________________________
AccessD mailing list
AccessD at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com