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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top