2009-03-12 2 views
3

Ich habe eine Tabelle, die ein Buch enthält und dann mehr Preise über das Buch (das ist eine stark vereinfachte Probe):bester Weg zu einem Median In Access 2007 zu berechnen, wenn Gruppenmitglied mit von

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

I Ich berechne den Durchschnitt leicht, aber es muss einen schönen Weg geben, den Median zu berechnen.

Aktuelle SQL:

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

Ergebnisse:

 
BOOK Avg Of PRICE 
BOOK1 12.3333333333333 
BOOK2 5 

Antwort

3

Es gibt keine Median in Jet SQL, es sei denn, es für das Jahr 2007 hinzugefügt wurde, aber hier ist eine Idee, wie man zu erhalten. Sie müssen ...

Einige SQL ...

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

Und ein User Defined Function (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 

Von: LessThanDot Wiki

+0

Hallo, zuerst war das sehr hilfreich als Ausgangspunkt, danke. Die UDF hat einen kleinen Fehler. Nach "rs.Move (rs.RecordCount/2)" müssen Sie die Zeile "rs.movePrevious" hinzufügen. Dies gibt Ihnen das richtige Median, wie Excel es berechnen würde. –

0

Es gibt keine integrierte Funktion ist - so müssen Sie Code in einer Schleife durch die Datensätze verwenden und das mittlere selbst ber.

Verwendung google - es gibt viele Code-Beispiele gibt

0

Median werden kann in MS Access mit nur regelmäßige Abfragen und ohne VBA berechnet werden. Median ist das 50. Perzentil. Erstellen Sie also Select-Abfragen normalerweise. Gehen Sie dann in die SQL-Ansicht und fügen Sie nach dem Schlüsselwort "Top 50 Prozent" ein. Sortiere aufsteigend nach unten 50 Prozent; Sortiere absteigend nach den besten 50 Prozent. Dann finden Sie das Maximum der unteren Prozent-Ergebnismenge und das Minimum der oberen Prozent-Ergebnismenge. Der Durchschnitt dieser beiden ist der Median. Stellen Sie bei der Verwendung von "Top 50 Prozent" sicher, dass die Kriterien in der Abfrage für die Ergebnismenge spezifisch sind, aus der der Median berechnet wird.

+0

Eine sehr nette Idee :) Aber können Sie sicher sein, dass der COUNT der Top/Bottom 50% aufgerundet wird, wenn die Anzahl der Zeilen ungerade ist? Wenn nicht, würde der ideale Median - der Wert genau in der Mitte - übersprungen werden. –

+0

Ein paar Tests scheinen nahe zu legen, dass es zumindest in den meisten Fällen aufrundet. Das heißt, es ist immer noch sehr langsam auf großen Datensätzen ... – tobriand