J'ai écrit cette fonction car je devait calculer une médiane statistique dans une application .Net
Il y a bien le code
http://support.microsoft.com/kb/210581 qui est probablement le seul qui fonctionne réellement de façon correcte mais il n'est utilisable qu'en VBA.
En .Net, l'accès aux données se fait en utilisant System.Data.OleDb.OleDbDataReader qui parcourt le flux de données uniquement à sens unique.
Je vous propose une fonction Median adaptée à l'utilisation de OleDbDataReader.
Pour ceux que cela intéresse, vous trouverez également sur ce site une fonction Quantile permettant de calculer de façon plus générique aussi bine la médiane que n'importe quel autre centile.
Source / Exemple :
Private Function Median(ByVal Table As String, ByVal Field As String, ByVal Filter As String, ByVal Connexion As OleDbConnection) As Double
Dim sFilter As String = ""
If Not IsNothing(Filter) Then sFilter = "AND (" & Filter & ")"
Dim SQLQuery As OleDbCommand = New OleDbCommand("SELECT COUNT([" & Field & "]) AS CNT FROM [" & Table & "] WHERE (([" & Field & "] IS NOT NULL) " & sFilter & ");", Connexion)
Dim Reader As System.Data.OleDb.OleDbDataReader = SQLQuery.ExecuteReader
Reader.Read()
Dim RecordCount As Long = Reader(0)
Reader.Close()
Reader = Nothing
SQLQuery = Nothing
SQLQuery = New OleDbCommand("SELECT [" & Field & "] FROM [" & Table & "] WHERE (([" & Field & "] IS NOT NULL) " & sFilter & ") ORDER BY [" & Field & "];", Connexion)
Reader = SQLQuery.ExecuteReader
Dim MedianValue As Double
Dim offset As Long
If (RecordCount Mod 2) = 0 Then
offset = (RecordCount / 2) - 1
For i As Long = 0 To offset
Reader.Read()
Next i
MedianValue = Reader(0)
Reader.Read()
Dim value2 As Double = Reader(0)
MedianValue = (MedianValue + value2) / 2
Else
offset = ((RecordCount + 1) / 2) - 1
For i As Long = 0 To offset
Reader.Read()
Next i
MedianValue = Reader(0)
End If
Reader.Close()
Reader = Nothing
SQLQuery = Nothing
Return MedianValue
End Function
Conclusion :
L'exemple ci-dessous montre comment utiliser la fonction Median
Soit dans la base de données "MaDb.mdb", une table "Données" avec les données suivantes
+--------+-------+
| Events | Group |
+--------+-------+
| 10 | 1 |
| 11 | 1 |
| 14 | 2 |
| 10 | 1 |
| 8 | 1 |
| 10 | 2 |
| 15 | 2 |
| 9 | 1 |
| 8 | 1 |
| 10 | 1 |
| 12 | 2 |
| 13 | 2 |
+--------+-------+
Pour calculer ma médiane de "Events" pour le groupe "1", procéder comme
Dim DbComm As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="MaDb.mdb;")
DbComm.Open()
Dim Mediane As Double = Median( "[Données]" , "Events", "((Group)=1)" , DbComm)
DbComm.Close()
DbComm = Nothing
Remarquez les [] autour de "Données", obligatoire en Access si on utilise des lettres accentuées
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.