ALL มีพฤติกรรมแตกต่างกัน 2 แบบ: ใช้เป็น Table Expression จะคืนทุกแถวในตาราง หรือทุกค่าในคอลัมน์ โดยไม่สนใจ Filter ใดๆ เหมาะสำหรับใช้ร่วมกับ FILTER, COUNTROWS, SUMMARIZE หรือใช้เป็น CALCULATE Modifier เพื่อลบ Filter ออกจากตารางหรือคอลัมน์ที่ระบุ ทำให้สามารถคำนวณ Grand Total หรือหาเปอร์เซ็นต์เทียบกับยอดรวมได้
=ALL(<table_or_column>[, <column>[, ...]])
=ALL(<table_or_column>[, <column>[, ...]])
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| table_or_column | table/column | Optional | ตารางหรือคอลัมน์ที่ต้องการ – ถ้าระบุตาราง จะคืนทุกแถวหรือลบ Filter ออกจากตารางนั้น ถ้าระบุคอลัมน์ จะคืนทุกค่า unique หรือลบ Filter ออกจากคอลัมน์นั้น | |
| column | column | Optional | คอลัมน์ที่ต้องการคืนทุกค่า unique หรือลบ Filter ออกจากคอลัมน์นั้น (ต้องเป็น base column ไม่สามารถใช้ calculated column ได้ สามารถระบุหลายคอลัมน์ได้) |
ใช้ ALL ภายใน CALCULATE เพื่อลบ Filter ทั้งหมดและหายอดรวมสูงสุด ไม่ว่าจะมี Slicer หรือ Filter อะไรอยู่ก็ตาม
ใช้ ALL เพื่อหาตัวหารที่เป็นยอดรวมทั้งหมด เพื่อคำนวณสัดส่วนของแต่ละส่วนเทียบกับยอดรวม
ใช้ ALL เป็น Table Expression ส่งให้ FILTER หรือฟังก์ชัน iterator เพื่อประมวลผลทุกแถว โดยไม่สนใจ Filter Context ภายนอก
ระบุคอลัมน์เฉพาะใน ALL เพื่อลบ Filter เฉพาะคอลัมน์นั้นๆ แต่ยังคง Filter อื่นๆ ไว้
All Product Categories = COUNTROWS( ALL(Products[Category]) )All Product Categories =
COUNTROWS(
ALL(Products[Category])
)
5
Total Sales All Products = CALCULATE( SUM(Sales[Amount]), ALL(Products) )Total Sales All Products =
CALCULATE(
SUM(Sales[Amount]),
ALL(Products)
)
1,250,000
% of Total Sales = VAR CurrentSales = SUM(Sales[Amount]) VAR TotalSales = CALCULATE( SUM(Sales[Amount]), ALL(Products[Category]) ) RETURN DIVIDE(CurrentSales, T…% of Total Sales =
VAR CurrentSales = SUM(Sales[Amount])
VAR TotalSales =
CALCULATE(
SUM(Sales[Amount]),
ALL(Products[Category])
)
RETURN
DIVIDE(CurrentSales, TotalSales, 0)
0.35 หรือ 35%
High Value Products = CALCULATETABLE( FILTER( ALL(Products), Products[Price] > 10000 ) )High Value Products =
CALCULATETABLE(
FILTER(
ALL(Products),
Products[Price] > 10000
)
)
ตารางที่มีสินค้าราคาเกิน 10,000 บาททั้งหมด
Sales Ignoring Category And Color = CALCULATE( SUM(Sales[Amount]), ALL(Products[Category], Products[Color]) )Sales Ignoring Category And Color =
CALCULATE(
SUM(Sales[Amount]),
ALL(Products[Category], Products[Color])
)
850,000
ถ้าใช้เป็น CALCULATE Modifier ทั้งสองทำงานเหมือนกันเลย คือลบ Filter ออกจากตาราง/คอลัมน์ที่ระบุ
.
แต่ความต่างคือ ALL สามารถใช้เป็น Table Function ได้ด้วย (คืนตาราง) ส่วน REMOVEFILTERS ใช้ได้แค่ใน CALCULATE/CALCULATETABLE เท่านั้น
.
ส่วนตัวผมแนะนำให้ใช้ REMOVEFILTERS เมื่อต้องการลบ Filter ครับ เพราะชื่อชัดเจนกว่า อ่านโค้ดแล้วรู้เลยว่ากำลังทำอะไร ไม่ต้องมานั่งคิดว่า ALL ตรงนี้คือ Table Function หรือ Modifier 😎
ALL ลบ Filter ทั้งหมด ได้ Grand Total แท้จริง
.
ALLSELECTED ลบ Filter เฉพาะภายใน Visual (Row Context, Column Context) แต่ยังคง Filter จาก Slicer, Page Filter, Report Filter ไว้
.
ตัวอย่าง: ถ้า Slicer เลือก Year = 2024 อยู่
– ALL จะได้ยอดรวมทุกปี (2020-2024)
– ALLSELECTED จะได้ยอดรวมเฉพาะ 2024 (ตาม Slicer)
.
ส่วนตัวผมใช้ ALL เวลาต้องการ “ยอดรวมสุดท้าย” จริงๆ ส่วน ALLSELECTED ใช้เวลาต้องการ “ยอดรวมตามที่ User เลือก” 💡
เรื่องนี้เจอบ่อยมากครับ 😅 เพราะ DAX มีแนวคิดที่เรียกว่า “Expanded Table”
.
เมื่อใช้ ALL กับ Fact Table (เช่น Sales) DAX จะลบ Filter ออกจากทั้ง Fact Table และ Dimension Table ทุกตารางที่มี Relationship แบบ one-to-many ด้วย
.
ตัวอย่าง: ถ้า Sales มี Relationship ไปยัง Date, Products, Customers
– ALL(Sales) จะลบ Filter จาก Sales, Date, Products, Customers ทั้งหมด
.
ถ้าต้องการลบเฉพาะบางคอลัมน์ ให้ใช้ ALL(Table[Column]) แทน เช่น ALL(Date[Year]) จะลบแค่ Filter ปีเท่านั้น
ALL() ไม่มี argument ใช้ได้เฉพาะใน CALCULATE/CALCULATETABLE เท่านั้น และจะลบ Filter ทั้งหมดออกจาก Filter Context
.
คำเตือน: ใช้ด้วยความระมัดระวังครับ เพราะมันลบ Filter ทุกอย่างเลย รวมถึง Filter จาก Relationship ด้วย อาจทำให้ได้ผลลัพธ์ที่ไม่ตรงตามที่คาดหวัง 😅
.
ส่วนตัวผมไม่ค่อยแนะนำให้ใช้ ALL() แบบไม่มี argument ครับ ควรระบุตาราง/คอลัมน์ให้ชัดเจนเสมอ เพื่อควบคุม Filter ได้แม่นยำกว่า
ALL ต้องใช้กับ base column เท่านั้น ไม่สามารถใช้กับ calculated column ได้
.
เหตุผลคือ Calculated Column ถูกสร้างขึ้นจาก expression ไม่ใช่คอลัมน์จริงในตาราง ดังนั้น DAX ไม่สามารถ reference ได้แบบ direct
.
ถ้าต้องการใช้ ALL กับข้อมูลที่คำนวณมา ให้สร้างเป็น measure หรือใช้ table expression แทนครับ
.
ตัวอย่างที่ผิด: ALL(Products[Calculated Price])
.
ทางแก้: ใช้ FILTER(ALL(Products), [Price] * 1.1 > 10000) แทน 💡
ขึ้นอยู่กับว่าเราใช้แบบไหนครับ
.
ALL(Table) คืนทุกแถวรวมถึงแถวที่ซ้ำกันด้วย (duplicate rows)
.
ALL(Column) หรือ ALL(Column1, Column2, …) คืนเฉพาะค่า unique combinations ไม่มี duplicate
.
ตัวอย่าง: ถ้า Sales มี 1000 transactions
– ALL(Sales) คืน 1000 แถว (รวม duplicate)
– ALL(Sales[ProductID]) คืนเฉพาะ ProductID ที่ไม่ซ้ำกัน (สมมติ 50 products)
.
เรื่องนี้สำคัญมากเวลาใช้ COUNTROWS ครับ ต้องระวังว่าเรานับอะไรอยู่ 😎
ALL เป็นฟังก์ชันที่มี 2 บทบาทหลัก ที่แตกต่างกันโดยสิ้นเชิง ขึ้นอยู่กับว่าเราใช้มันในบริบทไหน
.
ที่เจ๋งคือฟังก์ชันเดียวกัน แต่พฤติกรรมต่างกันเลย ตอนแรกผมก็งงเหมือนกันครับ 😅 แต่พอเข้าใจแล้วจะรู้เลยว่ามันเป็น “หัวใจ” ของ DAX จริงๆ
.
บทบาทที่ 1: Table Function เมื่อใช้ ALL ในบริบทที่ต้องการตาราง (เช่น ใน FILTER, COUNTROWS) มันจะคืนตารางที่มีทุกแถว หรือทุกค่าในคอลัมน์ โดยไม่สนใจ Filter Context ที่มีอยู่
.
บทบาทที่ 2: CALCULATE Modifier เมื่อใช้ ALL ภายใน CALCULATE หรือ CALCULATETABLE มันจะไม่คืนตาราง แต่ทำหน้าที่ลบ Filter ออกจาก Filter Context แทน
.
ส่วนตัวผมคิดว่า ถ้าจะเข้าใจ DAX ให้ลึกจริงๆ ต้องเข้าใจ ALL ให้ชัดเจน เพราะมันเกี่ยวข้องกับ Filter Context ซึ่งเป็นแนวคิดพื้นฐานที่สำคัญที่สุดของ DAX เลยก็ว่าได้ 😎