문제

책이 포함 된 테이블과 책에 대한 여러 가격이 포함되어 있습니다 (이것은 매우 단순화 된 샘플입니다).

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

평균을 쉽게 계산하고 있지만 중앙값을 계산하는 좋은 방법이 있어야합니까?

현재 SQL :

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

결과:

BOOK    Avg Of PRICE
BOOK1   12.3333333333333
BOOK2   5

도움이 되었습니까?

해결책

2007 년에 추가되지 않는 한 Jet SQL에는 중앙값이 없지만 여기에 하나를 얻는 방법에 대한 아이디어가 있습니다. 필요할 것이예요 ...

SQL ...

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

및 사용자 정의 함수 (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

에서: 더 적은 위키

다른 팁

중앙값은 일반 쿼리 만 사용하여 VBA없이 MS 액세스에서 계산할 수 있습니다. 중앙값은 50 번째 백분위 수입니다. 따라서 선택 쿼리를 정상적으로 만듭니다. 그런 다음 SQL보기로 이동하여 선택한 키워드 후 "Top 50 %"를 포함하십시오. 바닥 50 %의 오름차순을 정렬합니다. 상위 50 %의 내림차순을 정렬합니다. 그런 다음 최대 바닥 백분율 결과 세트와 최소 상단 백분율 결과 세트의 최소값을 찾으십시오. 이 두 가지의 평균은 중앙값입니다. "Top 50 %"를 사용하는 경우 쿼리의 기준이 중앙값을 계산할 결과 세트에만 해당되는지 확인하십시오.

기능이 내장되어 있지 않으므로 코드를 사용하여 레코드를 루프하고 중간 값을 계산해야합니다.

사용 Google - 코드 샘플이 많이 있습니다

나는 비 VBA 방법을 사용하려고 노력했으며 모두 다소 제한되어 있으며 더 큰 데이터 세트에 대해 가장 정확한 결과를 줄 수는 없습니다. 상위 50 % ASC (MAX) 및 상위 50 % DESC (MIN) 방법의 경우 액세스는 제한이 있으며 오름차순 순서로 주문할 때 단일 값을 생략합니다. 반올림을 위해 액세스는 뱅커 반올림을 사용하므로 값 자체에 따라 항상 반올림하는 것은 아니므로 반올림되거나 아래로 이동하려면 +-0.00001의 후행 값을 추가해야합니다. 또한 VBA가없는 다른 Rank () 메소드를 시도했으며 액세스는 적어도 한 쌍의 동일한 값을 가진 순위 값에 어려움을 겪고 있습니다. 위의 이유로 VBA에서 사용자 정의 기능을 만드는 것을 강력히 제안합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top