2009-03-12 15 views
3

J'ai une table qui contient un livre et plusieurs prix sur le livre (ce qui est un échantillon très simplifié):meilleure façon de calculer une médiane Dans Access 2007 lors de l'utilisation du groupe par

 
ID BOOK PRICE 
1 BOOK1 10 
2 BOOK1 15 
3 BOOK1 12 
4 BOOK2 8 
5 BOOK2 2 

I Je calcule facilement la moyenne, mais il doit y avoir une bonne façon de calculer la médiane?

SQL actuel:

SELECT DISTINCTROW Books.BOOK, Avg(Books.PRICE) AS [Avg Of PRICE] 
FROM Books 
GROUP BY Books.BOOK; 

Résultats:

 
BOOK Avg Of PRICE 
BOOK1 12.3333333333333 
BOOK2 5 

Répondre

3

Il n'y a pas médian en Jet SQL, sauf si elle a été ajoutée pour 2007, mais voici une idée de la façon d'obtenir un. Vous aurez besoin ...

Certains SQL ...

SELECT Statistics.Month, Sum(([SentTo])) AS [Sum Sent], fMedian("Statistics","Month",[Month],"SentTo") AS [Median Sent] 
FROM Statistics 
GROUP BY Statistics.Month; 

et une fonction définie par l'utilisateur (UDF).

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) 

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 

De: LessThanDot Wiki

+0

Salut, d'abord cela a été très utile comme point de départ, merci. L'UDF a une petite erreur. Après "rs.Move (rs.RecordCount/2)", vous devrez ajouter la ligne "rs.movePrevious". Cela vous donnera la médiane correcte comme Excel le calculerait. –

0

Il n'y a pas construit en fonction - donc vous devez utiliser le code pour boucler les enregistrements et calco la médiane vous.

utilisation google - il y a beaucoup d'exemples de code là-bas

0

médian peut être être calculée en MS Access en utilisant des requêtes juste régulières et sans VBA. Médiane est le 50e centile. Donc, créez des requêtes select normalement; puis passez en mode SQL et incluez "Top 50%" après le mot-clé select. Trier ascendant pour les 50% inférieurs; trier décroissant pour les 50 premiers pour cent. Ensuite, trouvez le maximum du résultat du pourcentage inférieur et le minimum du résultat du pourcentage supérieur. La moyenne de ces deux est la médiane. Lorsque vous utilisez "Top 50%", assurez-vous que les critères de la requête sont spécifiques à ce jeu de résultats à partir duquel la médiane sera calculée.

+0

Une très bonne idée :) Mais pouvez-vous être sûr que le COUNT du Top/Bottom 50% est arrondi lorsque le nombre de lignes est impair? Sinon, la médiane idéale - la valeur exactement au milieu - serait ignorée. –

+0

Un couple de tests semblent suggérer qu'au moins dans la plupart des cas, il arrondit. Cela dit, c'est encore très lent sur les grands ensembles de données ... – tobriand

Questions connexes