หาค่า Median
กระทู้เก่าบอร์ด อ.Yeadram

 3,763   8
URL.หัวข้อ / URL
หาค่า Median

ผมมี ข้อมุลยอดซื้อของลูกค้า ตาม order อยู่แต่อยากหาค่า Median ของยอดซื้อของลูกค้าครับ ไม่ทราบว่าต้องทำอย่างไรบ้าง เพราะหา function ไม่เจอ

รูปแบบข้อมูลที่มีจะเป็น

Cust_ID = txt
INV_ID =txt
Sales AMT = double

ขอบคุณล่วงหน้าครับ

8 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R11350
ถามหน่อยครับ
Median หมายถึงอะไรครับ?
2 @R11351
ค่า Median เป็นค่าทางคณิตศาสตร์คือค่าที่อยู่ตรงกลางของจำนวนข้อมูลทั้งหมด
มี 2 กรณีคือ
1. จำนวนข้อมูลเป็นจำนวนคี่ เช่น 1,2,4,6,17,20,15 (7จำนวน) ค่าที่อยู่ตรงกลาง (Median) คือลำดับที่ 4 ซึ่งก็คือ 6 (ต้องนำข้อมูลมาเรียงลำดับก่อน จากน้อยไปมากหรือมากไปน้อยก็ได้)
2. จำนวนข้อมูลเป็นจำนวนคู่เช่น 1,3,4,8,12,16,18,24,36,100 (10จำนวน) ในกรณีนี้ ค่าที่อยู่ตรงกลาง (Median) คือค่าเฉลี่ยของเลขที่ลำดับคู่กลาง นั่นคือลำดับที่ 5 และ 6 = (12+16)/2 =14
เพราะฉนั้นคงต้องเขียน Function ขึ้นมาใช้เอง ผมเชื่อว่าในนี้หลายท่านมีความสามารถครับ
3 @R11355
พยายามจะเขียนเป็น SQL statement เดียวครับ แต่ยังคิดไม่ออก เอาแบบ code ยาวๆ ไปก่อนนะครับ

ถ้าต้องการเงื่อนไขต่างๆ ก็เติม where เข้าไปนะครับ

Public Function Median()
    dblResult = 0
    
    Set rsCount = CurrentDb.OpenRecordset("Select Count(*) From SalesOrder", dbOpenSnapshot, dbReadOnly)
    sngCount = rsCount(0)
    Set rsCount = Nothing
    
    If ((sngCount) Mod 2) = 0 Then
    'Get 2 mid value
        strSQL = "Select Max(SaleAmount) From (Select Top " & (sngCount / 2) & " SaleAmount From Item SalesOrder By SaleAmount)"
        Set rsValue = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot, dbReadOnly)
        Value1 = rsValue(0)
        rsValue = Nothing
        strSQL = "Select Max(SaleAmount) From (Select Top " & (sngCount / 2) + 1 & " SaleAmount From SalesOrder Order By SaleAmount)"
        Set rsValue = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot, dbReadOnly)
        Value2 = rsValue(0)
        rsValue = Nothing

        dblResult = (Value1 + Value2) / 2

    Else

    'Get 1 mid value
        strSQL = "Select Max(SaleAmount) From (Select Top " & (sngCount - 1) / 2 & " SaleAmount From Item SalesOrder By SaleAmount)"
        Set rsValue = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot, dbReadOnly)
        dblResult = rsValue(0)
        rsValue = Nothing
    End If

    MedianItem = dblResult
End Function

ถ้าต้องการคำอธิบาย ก็ถามมาละกันครับ
4 @R11356
Search จาก InterNet แล้วครับ
ได้มา 2 ที่ เขียนสั้นกว่าของผม
http://bytes.com/topic/access/answers/608740-how-write-code-median

http://www.fabalou.com/Access/Modules/recordset_median.asp

ลองเลือกใช้ดูครับ

ว่าแต่ทำไมไม่ลอง search ดูก่อนล่ะครับ?
(ผมทำไปเพื่อลับสมอง แล้วคุณล่ะ?)
5 @R11361
ขอบคุณมากครับ ผมลอง search ดูแล้วครับ แต่ไม่เจอตัวที่ใช่ เนื่องจากค่า Median ที่ต้องการจะเป็นค่า Median ของยอดซื้อของแต่ละลุกค้าแต่ละคน โดยมี Cust_ID เป็นตัวกำหนด
6 @R11362
รบกวนถามคุณ Pichai TC ครับ

เท่าที่ลองดูจากที่คุณ Pichai เขียนให้ และตาม Link น่าจะป็นการหาค่า Median ของลูกค้าทั้งหมดไม่ใช่รายคนตาม Cust ID ใช่ไหมครับ ?
7 @R11366
R11355 ถ้าต้องการเงื่อนไขต่างๆ ก็เติม where เข้าไปนะครับ

Select Count(*) From SalesOrder Where CustID = "xxx"

Select Max(SaleAmount)
From (Select Top " & (sngCount / 2) & " SaleAmount
   From SalesOrder
   Where CustID = "xxx"
   Order By SaleAmount)
8 @R11371
ขอบคุณครับ ขอเวลาศึกษาดูก่อน ผมไม่เคยใช้ VB เหมือนกัน
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3825s