Il modo migliore per calcolare una mediana in Access 2007 quando si utilizza Group By
-
11-07-2019 - |
Domanda
Ho una tabella che contiene un libro e quindi più prezzi sul libro (questo è un esempio altamente semplificato):
ID BOOK PRICE 1 BOOK1 10 2 BOOK1 15 3 BOOK1 12 4 BOOK2 8 5 BOOK2 2
Sto calcolando facilmente la media, ma ci deve essere un buon modo per calcolare la mediana?
SQL corrente:
SELECT DISTINCTROW Books.BOOK, Avg(Books.PRICE) AS [Avg Of PRICE]
FROM Books
GROUP BY Books.BOOK;
Risultati:
BOOK Avg Of PRICE BOOK1 12.3333333333333 BOOK2 5
Soluzione
Non esiste una mediana in Jet SQL, a meno che non sia stata aggiunta per il 2007, ma ecco un'idea su come ottenerne una. Avrai bisogno di ...
Alcuni SQL ...
SELECT Statistics.Month, Sum(([SentTo])) AS [Sum Sent], fMedian("Statistics","Month",[Month],"SentTo") AS [Median Sent]
FROM Statistics
GROUP BY Statistics.Month;
E una funzione definita dall'utente (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
Da: LessThanDot Wiki
Altri suggerimenti
La mediana può essere calcolata in MS Access usando solo query regolari e senza VBA. La mediana è il 50 ° percentile. Quindi, creare query di selezione normalmente; quindi vai in visualizzazione SQL e includi " Top 50 percento " dopo selezionare la parola chiave. Ordinamento crescente per il 50 percento inferiore; ordinamento decrescente per il 50 percento superiore. Quindi trova il massimo del set di risultati percentuale inferiore e il minimo del set di risultati percentuale massimo. La media di questi due è la mediana. Quando si utilizza " Top 50 percento " ;, assicurarsi che i criteri nella query siano specifici per quel set di risultati da cui verrà calcolata la mediana.
Non esiste una funzione integrata, quindi è necessario utilizzare il codice per scorrere i record e calcolare da soli la mediana.
Usa google - ci sono molti esempi di codice là fuori
Ho provato a usare metodi non VBA e sono tutti piuttosto limitati e non sono in grado di darti il ??risultato più accurato per un set di dati più grande. Per il metodo Top 50 Perc. Asc (Max) e Top 50 Percent Desc (Min), Access ha una limitazione e omette i singoli valori quando viene ordinato in ordine crescente. Per l'arrotondamento, Access utilizza l'arrotondamento dei banchieri, quindi non sempre arrotondando per eccesso a seconda del valore stesso, è necessario aggiungere un valore finale di + -0,00001 se si desidera arrotondare per eccesso o per difetto. Ho anche provato un altro metodo Rank () senza VBA e Access ha problemi a classificare i valori che hanno almeno una coppia di valori identici. Per i motivi precedenti, consiglio vivamente di attenersi alla creazione della funzione di personalizzazione in VBA.