AVERAGEX เป็น Iterator Function ที่วนลูปตารางทีละแถว คำนวณ Expression แล้วนำผลลัพธ์มาหาค่าเฉลี่ย เหมาะสำหรับกรณีที่ต้องการเฉลี่ยค่าที่คำนวณได้ เช่น ราคา×จำนวน หรือค่าเฉลี่ยของ Measure ในแต่ละกลุ่ม
=AVERAGEX(<table>, <expression>)
=AVERAGEX(<table>, <expression>)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| table | Table | Yes | ตารางที่ต้องการวนลูป อาจเป็นตารางจริงหรือ Table Expression (เช่น VALUES, FILTER, CALCULATETABLE) | |
| expression | Scalar | Yes | นิพจน์ที่ต้องการประเมินค่าในแต่ละแถว แล้วนำผลลัพธ์มาหาค่าเฉลี่ย (สามารถเป็น Column Reference, Measure หรือ Calculated Expression) |
สร้างตารางกลุ่มด้วย VALUES แล้วให้ AVERAGEX เฉลี่ยค่าของแต่ละกลุ่ม
เช่น เฉลี่ยราคาแบบคำนวณจาก Amount/Quantity ต่อแถว
Average Order Cost = AVERAGEX( Sales, Sales[Freight] + Sales[TaxAmount] )Average Order Cost =
AVERAGEX(
Sales,
Sales[Freight] + Sales[TaxAmount]
)
125.50
Average Line Total = AVERAGEX( Sales, Sales[Quantity] * Sales[UnitPrice] )Average Line Total =
AVERAGEX(
Sales,
Sales[Quantity] * Sales[UnitPrice]
)
1,250.75
Average Sales per Category = VAR CategoryTable = VALUES(Products[Category]) RETURN AVERAGEX( CategoryTable, [Total Sales] )Average Sales per Category =
VAR CategoryTable = VALUES(Products[Category])
RETURN
AVERAGEX(
CategoryTable,
[Total Sales]
)
50,000
Average High Value Sales = VAR HighValueSales = FILTER( Sales, Sales[Amount] > 1000 ) RETURN AVERAGEX( HighValueSales, Sales[Amount] )Average High Value Sales =
VAR HighValueSales =
FILTER(
Sales,
Sales[Amount] > 1000
)
RETURN
AVERAGEX(
HighValueSales,
Sales[Amount]
)
2,500
Average Discount Pct = AVERAGEX( Sales, IF( NOT(ISBLANK(Sales[DiscountPct])), Sales[DiscountPct], 0 ) )Average Discount Pct =
AVERAGEX(
Sales,
IF(
NOT(ISBLANK(Sales[DiscountPct])),
Sales[DiscountPct],
0
)
)
0.08
AVERAGE ทำงานกับคอลัมน์เดียวโดยตรง (เช่น AVERAGE(Sales[Amount])) ส่วน AVERAGEX วนลูปตารางทีละแถวและประเมินค่า Expression ก่อน (เช่น Sales[Quantity] * Sales[UnitPrice]) จึงยืดหยุ่นกว่าแต่ช้ากว่า
ใช้เมื่อ: 1) ต้องการเฉลี่ยนิพจน์ที่คำนวณได้ (เช่น ราคา×จำนวน) 2) ต้องการเฉลี่ย Measure ต่อกลุ่ม 3) ต้องการความยืดหยุ่นในการประเมินค่าทีละแถว หากเป็นคอลัมน์เดียวให้ใช้ AVERAGE เพียงพอ
ค่า Blank ที่ return จาก Expression จะถูกข้ามไป (ไม่นับในตัวหาร) แต่ค่า 0 จะนับ ตัวอย่าง: ถ้ามี 10 แถว แต่ 2 แถว return Blank จะหารด้วย 8 เท่านั้น
ใช่ เพราะเป็น Iterator ที่ประมวลผลทีละแถว ถ้าตารางมีหลายล้านแถวจะช้ามาก ควรใช้ FILTER/VALUES ลดขนาดตารางก่อน และพิจารณาว่าจำเป็นต้องใช้จริงหรือไม่
AVERAGEX เป็นฟังก์ชันแบบ Iterator ที่จะวนลูปตารางทีละแถว ประเมินค่า Expression ที่เราระบุ แล้วนำผลลัพธ์ทั้งหมดมาหาค่าเฉลี่ย ซึ่งต่างจาก AVERAGE ที่ทำงานกับคอลัมน์เดียวโดยตรง
ใช้ AVERAGEX เมื่อคุณต้องการ:
– หาค่าเฉลี่ยของนิพจน์ที่คำนวณได้ เช่น Sales[Quantity] * Sales[UnitPrice]
– หาค่าเฉลี่ยของ Measure ในแต่ละกลุ่ม เช่น ค่าเฉลี่ยยอดขายต่อหมวดหมู่สินค้า
– ต้องการความยืดหยุ่นในการประเมินค่าทีละแถวก่อนหาค่าเฉลี่ย
ที่ต้องระวังคือ Expression ที่ return ค่า Blank จะถูกข้ามไป (ไม่นับใน average) แต่ค่า 0 จะถูกนับ ซึ่งส่งผลต่อตัวหารของค่าเฉลี่ย
ส่วนตัวผมคิดว่า AVERAGEX เป็นฟังก์ชันที่ทรงพลังมาก แต่ต้องใช้อย่างระมัดระวังเพราะเป็น Iterator ที่ประมวลผลทีละแถว ถ้าตารางใหญ่มากอาจช้า ดังนั้นควรใช้เฉพาะเมื่อจำเป็นจริงๆ และพิจารณาใช้ FILTER หรือ VALUES เพื่อลดขนาดตารางที่ต้องวนลูป 😎