AVERAGEX เป็น Iterator Function ที่วนลูปตารางทีละแถว คำนวณ Expression แล้วนำผลลัพธ์มาหาค่าเฉลี่ย เหมาะสำหรับกรณีที่ต้องการเฉลี่ยค่าที่คำนวณได้ เช่น ราคา×จำนวน หรือค่าเฉลี่ยของ Measure ในแต่ละกลุ่ม
| อาร์กิวเมนต์ | ชนิด | คำอธิบาย |
|---|---|---|
| table | Table | ตารางที่ต้องการวนลูป อาจเป็นตารางจริงหรือ Table Expression (เช่น VALUES, FILTER, CALCULATETABLE) |
| expression | Scalar | นิพจน์ที่ต้องการประเมินค่าในแต่ละแถว แล้วนำผลลัพธ์มาหาค่าเฉลี่ย (สามารถเป็น Column Reference, Measure หรือ Calculated Expression) |
AVERAGEX เป็นฟังก์ชันแบบ Iterator ที่จะวนลูปตารางทีละแถว ประเมินค่า Expression ที่เราระบุ แล้วนำผลลัพธ์ทั้งหมดมาหาค่าเฉลี่ย ซึ่งต่างจาก AVERAGE ที่ทำงานกับคอลัมน์เดียวโดยตรง
ใช้ AVERAGEX เมื่อคุณต้องการ:
– หาค่าเฉลี่ยของนิพจน์ที่คำนวณได้ เช่น Sales[Quantity] * Sales[UnitPrice]
– หาค่าเฉลี่ยของ Measure ในแต่ละกลุ่ม เช่น ค่าเฉลี่ยยอดขายต่อหมวดหมู่สินค้า
– ต้องการความยืดหยุ่นในการประเมินค่าทีละแถวก่อนหาค่าเฉลี่ย
ที่ต้องระวังคือ Expression ที่ return ค่า Blank จะถูกข้ามไป (ไม่นับใน average) แต่ค่า 0 จะถูกนับ ซึ่งส่งผลต่อตัวหารของค่าเฉลี่ย
ส่วนตัวผมคิดว่า AVERAGEX เป็นฟังก์ชันที่ทรงพลังมาก แต่ต้องใช้อย่างระมัดระวังเพราะเป็น Iterator ที่ประมวลผลทีละแถว ถ้าตารางใหญ่มากอาจช้า ดังนั้นควรใช้เฉพาะเมื่อจำเป็นจริงๆ และพิจารณาใช้ FILTER หรือ VALUES เพื่อลดขนาดตารางที่ต้องวนลูป 😎
สร้างตารางกลุ่มด้วย VALUES แล้วให้ AVERAGEX เฉลี่ยค่าของแต่ละกลุ่ม
เช่น เฉลี่ยราคาแบบคำนวณจาก Amount/Quantity ต่อแถว
คำนวณค่าขนส่ง + ภาษีในแต่ละรายการขาย แล้วหาค่าเฉลี่ย นี่คือกรณีที่ไม่สามารถใช้ AVERAGE ได้เพราะต้องบวก 2 คอลัมน์ก่อน
หาค่าเฉลี่ยของมูลค่ารายการ (Quantity × UnitPrice) ต่อแถว ซึ่งจะให้ผลลัพธ์ต่างจาก AVERAGE(Sales[Quantity]) * AVERAGE(Sales[UnitPrice])
สร้างตารางหมวดหมู่ที่ไม่ซ้ำด้วย VALUES แล้วหาค่าเฉลี่ยของ [Total Sales] ในแต่ละหมวดหมู่ เหมาะสำหรับการวิเคราะห์ว่าหมวดหมู่เฉลี่ยทำยอดขายได้เท่าไหร่
ใช้ FILTER กรองเฉพาะรายการที่มียอดขายมากกว่า 1,000 ก่อน แล้วหาค่าเฉลี่ย เหมาะสำหรับการวิเคราะห์เฉพาะกลุ่มที่ต้องการ
แปลงค่า Blank เป็น 0 เพื่อนับในการเฉลี่ย ถ้าไม่ทำ DAX จะข้ามแถวที่ Blank ซึ่งอาจทำให้ผลลัพธ์คลาดเคลื่อน
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 จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
AVERAGE คำนวณค่าเฉลี่ยเลขคณิตของตัวเลขทั้งหมดในคอลัมน์ โดยข้าม blank cells และข้อความ แต่นับค่า 0 เข้าในการคำนวณ ซึ่งทำให้ค่าเฉลี่ยอาจต่ำลงถ้ามีค่า 0 จำนวนมาก ทำงานภายใต้ filter context ปัจจุบันและทำ context transition ใน calculated column ทำให้สามารถอ้างอิงคอลัมน์จากตารางอื่นผ่าน relationship ได้
AVERAGEA คืนค่าเฉลี่ยของค่าภายในคอลัมน์ และรวมการประมวลผลค่าตรรกะ/ข้อความตามกติกา (เช่น TRUE=1, FALSE=0, ข้อความ=0) เหมาะเมื่อข้อมูลมีชนิดปะปนและต้องการสะท้อนผลของค่าที่ไม่ใช่ตัวเลข
MAXX ประเมินนิพจน์สำหรับทุกแถวของตาราง แล้วคืนค่าที่มากที่สุด เหมาะกับการหาค่าสูงสุดจากค่าที่คำนวณต่อแถว ไม่ใช่แค่การสรุปคอลัมน์โดยตรง
MINX ประเมินนิพจน์สำหรับทุกแถวของตาราง แล้วคืนค่าที่น้อยที่สุด ต่างจาก MIN ที่ใช้กับคอลัมน์โดยตรง MINX เหมาะกับการหาค่าต่ำสุดจากค่าที่คำนวณต่อแถว เช่น (Quantity × UnitPrice)
PRODUCTX วนประเมิน Expression บน Table แล้วคูณผลลัพธ์ของแต่ละแถวเข้าด้วยกันเป็นค่าเดี่ยว เหมาะกับการคูณปัจจัย/อัตราการเปลี่ยนแปลงต่อเนื่องหลายงวด และควรระวัง BLANK/ศูนย์/ค่าติดลบตามตรรกะงาน
SUMX เป็น iterator function ที่ทรงพลังใน DAX ออกแบบมาเพื่อวนลูปทีละแถวในตารางที่กำหนด แล้วคำนวณ expression ที่ซับซ้อนสำหรับแต่ละแถวก่อนนำผลลัพธ์ทั้งหมดมารวมกัน ต่างจาก SUM ที่รวมเฉพาะค่าใน column เดียว SUMX สร้าง row context สำหรับแต่ละแถว ทำให้สามารถคำนวณ expression อย่าง Quantity × Price หรือใช้ RELATED ดึงข้อมูลข้ามตารางได้ มีกลไก context transition อัตโนมัติเมื่อเจอ measure ในนั้น เหมาะสำหรับการคำนวณซับซ้อนระดับแถวข้อมูล ประหยัดพื้นที่ model เพราะไม่ต้องสร้าง calculated column แต่ช้ากว่า SUM และไม่รองรับ DirectQuery mode ใน calculated columns หรือ RLS rules
GEOMEANX คำนวณค่าเฉลี่ยเรขาคณิต (Geometric Mean) ของค่าที่คำนวณจากการประเมินนิพจน์ในแต่ละแถว ต่างจาก AVERAGEX ที่คำนวณค่าเฉลี่ยเลขคณิต ค่าเฉลี่ยเรขาคณิตเหมาะสำหรับการคำนวณอัตราการเปลี่ยนแปลง (Rate of Change) หรือการเติบโตแบบทบต้น (Compound Growth) เช่น อัตราผลตอบแทนการลงทุน
MEDIANX คำนวณค่ามัธยฐาน (50th Percentile) ของนิพจน์ที่ประเมินในแต่ละแถว ต่างจาก MEDIAN ที่ทำงานบนคอลัมน์เดียว MEDIANX คือ iterator function ที่ให้คุณสร้างนิพจล์ซับซ้อนก่อนหาค่ากลาง
STDEVX.P คำนวณค่าความเบี่ยงเบน (Standard Deviation) โดยสมมติว่าข้อมูลเป็นประชากรทั้งหมด (Population) ไม่ใช่ตัวอย่าง ใช้เมื่อ Expression ที่ประเมินแต่ละแถวจะส่งค่า Variance ของประชากรทั้งหมด STDEVX.P ต่างจาก STDEVX.S ซึ่งใช้กับตัวอย่าง
VARX.P คำนวณความแปรปรวน (Variance) โดยสมมติว่าข้อมูลเป็นประชากรทั้งหมด ไม่ใช่ตัวอย่าง วัดความกระจายตัวของค่ารอบค่าเฉลี่ย VARX.P ต่างจาก VARX.S ซึ่งใช้กับตัวอย่าง ความแปรปรวนเป็นกำลังสองของความเบี่ยงเบนมาตรฐาน
VARX.S คำนวณความแปรปรวน (Variance) โดยสมมติว่าข้อมูลเป็นตัวอย่าง (Sample) ไม่ใช่ประชากร วัดการกระจายตัวของค่าที่คำนวณแล้วจากการประเมินนิพจน์ ใช้เมื่อข้อมูลที่วิเคราะห์เป็นตัวอย่างเพียงบางส่วน VARX.S มีค่าสูงกว่า VARX.P เพราะใช้ Sampling Correction
CALCULATE เป็นฟังก์ชันหลักที่สำคัญที่สุดใน DAX ใช้สำหรับ evaluate expression ภายใต้ filter context ที่ถูกปรับเปลี่ยน สามารถเพิ่มตัวกรองใหม่ ลบตัวกรองเดิม หรือแทนที่ filter ที่มีอยู่ได้ รองรับทั้ง Boolean expression และ table expression เป็น filter arguments พร้อม filter modifier functions เช่น REMOVEFILTERS, ALL, ALLEXCEPT, KEEPFILTERS เพื่อควบคุมการกรองอย่างละเอียด มีพฤติกรรมพิเศษคือ context transition ที่เปลี่ยน row context เป็น filter context โดยอัตโนมัติ ทำให้เป็นเครื่องมือหลักในการสร้าง measure ที่ซับซ้อนและ calculated column ที่ต้องใช้ aggregation
CALCULATETABLE evaluate table expression ภายใต้ filter context ที่ถูกปรับเปลี่ยน แล้วคืนค่าเป็น table (ตาราง) ซึ่งแตกต่างจาก CALCULATE ที่คืนค่าเป็น scalar value รองรับ filter arguments 3 รูปแบบ: Boolean expression, table expression, และ filter modifier functions (REMOVEFILTERS, ALL, KEEPFILTERS, USERELATIONSHIP, CROSSFILTER) มีพฤติกรรมเหมือน CALCULATE ในทุกแง่มุมของการจัดการ filter context รวมถึง context transition แต่เหมาะสำหรับการสร้าง intermediate table ที่ถูกกรองแล้วส่งต่อให้ iterator functions หรือใช้ใน calculated table มักมี performance ดีกว่า FILTER ใน simple filtering scenarios เพราะ DAX engine สามารถทำ cardinality estimation และ optimization ได้ดีกว่า
FILTER ใช้กรองแถวในตารางตามเงื่อนไขที่ซับซ้อน โดยวนลูปทุกแถวและประเมินเงื่อนไข เหมาะกับการกรองด้วย Measure หรือ Expression ซึ่ง Boolean Expression ทำไม่ได้ แต่ต้องระวังเรื่อง Performance เพราะเป็น Iterator Function ที่ช้ากว่า Boolean Expression ดังนั้นควรใช้เฉพาะเมื่อจำเป็น และอย่าใช้ FILTER กับ RELATED เพื่อกรองข้ามตาราง ให้กรองที่ Dimension Table โดยตรงแทน
WINDOW ดึงช่วงแถวภายในพาร์ทิชัน คืนค่าเป็นตาราง เหมาะกับการคำนวณแบบช่วง เช่น moving average, running sum, หรือ lead/lag analysis
MOVINGAVERAGE คำนวณค่าเฉลี่ยเคลื่อนที่ (moving average) บนแกนของ Visual Calculations ในตารางข้อมูล เหมาะสำหรับทำเส้นแนวโน้มที่เรียบขึ้นและลดความผันผวนของข้อมูล
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่