ADDCOLUMNS เป็นฟังก์ชัน table transformation ที่ใช้สำหรับเพิ่มคอลัมน์ใหม่ (Calculated Columns) เข้าไปในตารางที่มีอยู่เดิม โดยคำนวณค่าในแต่ละแถวผ่าน Row Context และส่งคืนตารางเดิมพร้อมคอลัมน์ใหม่ต่อท้าย
| อาร์กิวเมนต์ | ชนิด | คำอธิบาย |
|---|---|---|
| table | Table | ตารางต้นฉบับ หรือตารางที่ได้จาก DAX Expression (เช่น FILTER, ALL, VALUES เป็นต้น) |
| name | Text | ชื่อของคอลัมน์ใหม่ที่ต้องการสร้าง ต้องใส่ในเครื่องหมายคำพูด “…” |
| expression | Scalar | สูตร DAX ที่ใช้คำนวณค่าในคอลัมน์ใหม่ จะถูกคำนวณในแต่ละแถวของตาราง (Row Context) |
ADDCOLUMNS ใช้สำหรับสร้างตารางชั่วคราว (Virtual Table) ที่มีคอลัมน์ใหม่เพิ่มเข้ามา โดยคำนวณค่าในแต่ละแถวของตาราง
.
ที่เจ๋งคือ ADDCOLUMNS ไม่ทิ้งคอลัมน์เดิมออกมาเลย เอาแบบเพิ่มต่อท้ายเข้ามา ซึ่งต่างจาก SELECTCOLUMNS ที่เลือกเฉพาะคอลัมน์ที่ต้องการ
.
ส่วนตัวผมใช้ ADDCOLUMNS บ่อยเมื่อต้องการสร้างตาราง helper มาใช้ใน SUMX หรือ FILTER เพราะมันเสริมข้อมูลเดิมได้อย่างไม่ทำลายโครงสร้างตาราง 😎
.
แต่ที่ต้องระวังคือฟังก์ชันนี้สร้าง Row Context เท่านั้น ถ้าคุณเขียนสูตร Aggregate (เช่น SUM) โดยไม่มี CALCULATE จะคำนวณยอดรวมทั้งตารางเลย ไม่ใช่แถวปัจจุบัน
ใช้ ADDCOLUMNS เพื่อเพิ่มคอลัมน์ Year, Month, Quarter, Fiscal Year เข้าไปในตารางที่สร้างจาก CALENDAR() หรือ CALENDARAUTO() เพื่อใช้เป็น Dimension Table หลักในโมเดล
เมื่อเขียนสูตรซับซ้อน เราสามารถใช้ ADDCOLUMNS สร้างตารางทดสอบเพื่อดูค่าที่คำนวณได้ในแต่ละแถว ก่อนที่จะนำไป Aggregate ด้วย SUMX หรือ AVERAGEX
สร้างคอลัมน์ใหม่ชื่อ NetPrice โดยคำนวณจากการคูณ Quantity กับ Price ในแต่ละแถว Row Context จะคำนวณอัตโนมัติสำหรับแต่ละแถว
เพิ่มสองคอลัมน์พร้อมกัน โดยใช้ช่วง name-expression pairs แต่ละคู่ ADDCOLUMNS จะคำนวณในลำดับ ดังนั้น FinalPrice สามารถอ้างอิง Amount ได้เลย
สำคัญ! เพราะใช้ CALCULATE ร่วมกับ SUM ภายในแถว จาก Row Context (Products[ProductID]) ของแต่ละแถว CALCULATE จะรู้ว่าต้องกรองยอดขายสำหรับสินค้านั้นเท่านั้น มันใช้ Filter Context Transition
ประยุกต์ใช้ชั้นสูง: GENERATE สร้างจำลองตาราง สูตรแรก ROW ทำให้ได้ SalesAmount แล้ว ADDCOLUMNS เข้ามาเพิ่ม SalesPct โดยหารด้วย ALL(Products) เพื่อได้สัดส่วนต่อยอดขายรวมทั้งหมด
ADDCOLUMNS จะ 'เก็บ' คอลัมน์เดิมของตารางไว้ทั้งหมด และเพิ่มคอลัมน์ใหม่ต่อท้าย ส่วน SELECTCOLUMNS จะ 'ทิ้ง' คอลัมน์เดิมทั้งหมด แล้วสร้างตารางใหม่ที่มีเฉพาะคอลัมน์ที่คุณระบุ ส่วนตัวผมใช้ ADDCOLUMNS ตอนต้องการเก็บข้อมูลเดิมไว้ แต่อยากเพิ่มข้อมูลใหม่เข้ามา
ปัญหานี้เจอบ่อยครับ 😅 สาเหตุหลักคือการใช้ฟังก์ชัน Aggregate (เช่น SUM) โดยไม่มี CALCULATE ข้าง หรือไม่ใช้ RELATED ในการเลือกคอลัมน์จากตาราง Related ถ้าจะใช้ SUM ต้องครอบด้วย CALCULATE เพื่อให้รู้ว่าต้องกรองข้อมูลตามแถวปัจจุบันนะครับ
ได้ทั้งสองแบบ! ใช้ใน Measures ได้ (เหมาะสำหรับสร้างตารางชั่วคราว) และใช้ใน Calculated Columns ของตารางได้ด้วย แต่ใน DirectQuery mode ไม่สนับสนุน Calculated Columns และ RLS rules ที่ใช้ ADDCOLUMNS
ใช่ ต้องใส่เครื่องหมายคำพูด " " เสมอ ถึงแม้ชื่อจะไม่มีช่องว่างก็ตาม ถ้าชื่อคอลัมน์มีช่องว่างหรืออักขระพิเศษ ให้ครอบด้วยวงเล็บเหลี่ยม [] แต่ส่วนตัวผมชอบใช้เครื่องหมายคำพูด เพราะมันชัดเจนว่า column ใหม่นี้จริง ๆ แล้วคือการคำนวณเท่านั้น 😎
ฟังก์ชันที่ผู้เขียนโยงไว้กับ ADDCOLUMNS จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
CROSSJOIN สร้างตารางใหม่โดยการรวมแถวทั้งหมดจากตารางที่ระบุ โดยสร้างทุก Combination ที่เป็นไปได้ ผลลัพธ์คือตารางที่มีจำนวนแถวเท่ากับผลคูณของจำนวนแถวของแต่ละตาราง
CURRENTGROUP คืนตารางย่อยของกลุ่มปัจจุบันและใช้ได้เฉพาะภายใน GROUPBY ช่วยให้คำนวณค่าที่อิงแถวภายในกลุ่มได้ เช่น SUMX/COUNTROWS/ MAXX ของกลุ่มนั้น
DATATABLE สร้างตารางแบบ hardcode ด้วยข้อมูลคงที่ โดยระบุชื่อคอลัมน์ ชนิดข้อมูล และค่าของแต่ละแถว เหมาะสำหรับตารางอ้างอิงเล็กๆ เช่น lookup table หรือข้อมูลตัวอย่าง
GENERATE วนทีละแถวใน Table1 แล้วประเมิน Table2 ในบริบทของแถวนั้น (row context) จากนั้นรวมผลทั้งหมดเป็นตารางเดียว ถ้า Table2 ว่างเปล่าในรอบไหน แถวนั้นจาก Table1 จะถูกตัดออก (ต่างจาก GENERATEALL)
GENERATEALL วนแถวของตาราง 1 แล้วสร้าง Cartesian product กับผลลัพธ์ของตาราง 2 โดยคงแถวที่ไม่มีข้อมูลย่อย ต่างจาก GENERATE ตรงที่ไม่ตัดแถวหลักออก
GENERATESERIES สร้างตารางคอลัมน์เดียวที่เป็นลำดับตัวเลขจาก StartValue ถึง EndValue ด้วย increment ที่กำหนดได้ เหมาะกับตารางช่วย parameter table หรือสร้างชุดตัวเลขสำหรับ what-if analysis
GROUPBY สร้างตารางสรุปโดยจัดกลุ่มตามคอลัมน์ที่กำหนด และเพิ่มคอลัมน์คำนวณแบบกลุ่มต่อกลุ่มได้ โดยใช้ CURRENTGROUP() เข้าถึงแถวภายในกลุ่ม เหมาะกับการคำนวณซ้อนหรือคำนวณจากคอลัมน์ชั่วคราว (local columns)
NATURALINNERJOIN ทำ inner join ระหว่าง LeftTable และ RightTable โดยใช้คอลัมน์ชื่อเดียวกันเป็นคีย์การจับคู่ คืนผลลัพธ์เฉพาะแถวที่จับคู่ได้ทั้งสองตาราง และมักใช้ร่วมกับ SELECTCOLUMNS เพื่อจัดชื่อคอลัมน์ให้ตรงกัน
สร้างตารางใหม่โดยเลือกเฉพาะคอลัมน์ที่ต้องการจากตารางต้นฉบับและเพิ่มคอลัมน์ที่คำนวณได้ ต่างจาก ADDCOLUMNS ตรงที่ SELECTCOLUMNS เริ่มจากตารางว่างแล้วเพิ่มเฉพาะคอลัมน์ที่ระบุ ทำให้สามารถปรับโครงสร้างตารางและเลือกข้อมูลที่จำเป็นได้อย่างยืดหยุ่น
SUMMARIZE สร้างตารางสรุปโดยจัดกลุ่มข้อมูลตามคอลัมน์ที่กำหนด คล้าย GROUP BY ใน SQL หรือ Pivot Table ใน Excel คืนค่าตารางที่มีหนึ่งแถวต่อหนึ่ง unique combination ของคอลัมน์ที่เลือก สามารถอ้างถึงคอลัมน์จาก related table ได้โดยตรงโดยไม่ต้องใช้ RELATED มักใช้สร้าง virtual table ใน measure เพื่อทำ intermediate calculations ก่อนใช้ iterator functions อย่าง SUMX, AVERAGEX คำนวณต่อ ⚠️ Best Practice: ใช้ ADDCOLUMNS ครอบ SUMMARIZE แทนการใส่ extension columns ตรงๆ เพื่อ performance และ filter context control ที่ดีกว่า สำหรับ calculated table แนะนำใช้ SUMMARIZECOLUMNS แทนเนื่องจากมี performance ดีกว่าอย่างมาก
SUMMARIZECOLUMNS เป็นฟังก์ชันหลักสำหรับสร้างตารางสรุปผล โดยจัดกลุ่มตามคอลัมน์ที่กำหนด พร้อมเพิ่มคอลัมน์คำนวณจากเมเชอร์ และสามารถใส่เงื่อนไขกรองได้ทันที
คืนตาราง Top N แถวจากตารางที่กำหนด โดยเรียงตามนิพจน์หนึ่งตัวหรือมากกว่า สามารถระบุทิศทางการเรียงลำดับแยกต่างหากสำหรับแต่ละเกณฑ์
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 โดยตรงแทน
CALENDAR ใช้สำหรับสร้างตารางวันที่ครบถ้วนตั้งแต่วันเริ่มต้นถึงวันสิ้นสุดโดยไม่มีช่องว่าง เหมาะสำหรับสร้างตารางวันที่โครงสร้างพื้นฐาน (Date Dimension) ที่ใช้ร่วมกับ Time Intelligence Function
CALENDARAUTO สร้างตารางวันที่อัตโนมัติโดยอิงช่วงวันที่ที่พบในโมเดล และสามารถกำหนดเดือนสิ้นสุดปีบัญชีได้ เหมาะกับการสร้าง Date table แบบเร็ว ๆ แต่ควรระวังค่าวันที่ผิดปกติในข้อมูล
EARLIER คืนค่าของคอลัมน์ใน Row Context ชั้นนอก (Outer Row Context) เพื่อให้คอลัมน์คำนวณสามารถอ้างอิงค่า “ของแถวปัจจุบัน” ระหว่างการวนซ้อน (เช่น FILTER ภายใน Calculated Column) ได้
RELATED คืนค่า scalar value (ค่าเดี่ยว) จากคอลัมน์ในตารางที่มีความสัมพันธ์แบบ many-to-one โดยอาศัย relationship ที่กำหนดไว้ในโมเดล ฟังก์ชันนี้ต้องการ row context และสามารถ traverse relationship chain ข้ามหลายขั้นได้ตราบใดที่ทุก relationship อยู่ในทิศทางเดียวกัน
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
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่