ADDCOLUMNS เป็นฟังก์ชัน table transformation ที่ใช้สำหรับเพิ่มคอลัมน์ใหม่ (Calculated Columns) เข้าไปในตารางที่มีอยู่เดิม โดยคำนวณค่าในแต่ละแถวผ่าน Row Context และส่งคืนตารางเดิมพร้อมคอลัมน์ใหม่ต่อท้าย
=ADDCOLUMNS(<table>, <name>, <expression>[, <name>, <expression>]...)
=ADDCOLUMNS(<table>, <name>, <expression>[, <name>, <expression>]...)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| table | Table | Yes | ตารางต้นฉบับ หรือตารางที่ได้จาก DAX Expression (เช่น FILTER, ALL, VALUES เป็นต้น) | |
| name | Text | Yes | ชื่อของคอลัมน์ใหม่ที่ต้องการสร้าง ต้องใส่ในเครื่องหมายคำพูด “…” | |
| expression | Scalar | Yes | สูตร DAX ที่ใช้คำนวณค่าในคอลัมน์ใหม่ จะถูกคำนวณในแต่ละแถวของตาราง (Row Context) |
ใช้ ADDCOLUMNS เพื่อเพิ่มคอลัมน์ Year, Month, Quarter, Fiscal Year เข้าไปในตารางที่สร้างจาก CALENDAR() หรือ CALENDARAUTO() เพื่อใช้เป็น Dimension Table หลักในโมเดล
เมื่อเขียนสูตรซับซ้อน เราสามารถใช้ ADDCOLUMNS สร้างตารางทดสอบเพื่อดูค่าที่คำนวณได้ในแต่ละแถว ก่อนที่จะนำไป Aggregate ด้วย SUMX หรือ AVERAGEX
ADDCOLUMNS( Sales, "NetPrice", [Quantity] * [Price] )=ADDCOLUMNS(
Sales,
"NetPrice", [Quantity] * [Price]
)
ตาราง Sales ที่มีคอลัมน์ NetPrice เพิ่มเข้ามา (รวม Quantity, Price, NetPrice)
ADDCOLUMNS( Sales, "DiscountAmount", [Amount] * 0.1, "FinalPrice", [Amount] * 0.9 )=ADDCOLUMNS(
Sales,
"DiscountAmount", [Amount] * 0.1,
"FinalPrice", [Amount] * 0.9
)
ตาราง Sales ที่มีคอลัมน์ DiscountAmount และ FinalPrice เพิ่มเข้ามา
ADDCOLUMNS( FILTER(Products, Products[Category] = "Electronics"), "TotalSales", CALCULATE(SUM(Sales[Amount])) )=ADDCOLUMNS(
FILTER(Products, Products[Category] = "Electronics"),
"TotalSales", CALCULATE(SUM(Sales[Amount]))
)
ตาราง Products ที่ filter เฉพาะ Category = Electronics พร้อมคอลัมน์ TotalSales
ADDCOLUMNS( GENERATE( VALUES(Products[ProductID]), ROW("SalesAmount", CALCULATE(SUM(Sales[Amount]))) ), "SalesPct", DIVIDE([SalesAmount], CALCULATE(SUM(Sales[Am…=ADDCOLUMNS(
GENERATE(
VALUES(Products[ProductID]),
ROW("SalesAmount", CALCULATE(SUM(Sales[Amount])))
),
"SalesPct", DIVIDE([SalesAmount], CALCULATE(SUM(Sales[Amount]), ALL(Products)), 0)
)
ตารางที่มีโครงสร้าง ProductID, SalesAmount, SalesPct พร้อมคำนวณสัดส่วน
ADDCOLUMNS จะ ‘เก็บ’ คอลัมน์เดิมของตารางไว้ทั้งหมด และเพิ่มคอลัมน์ใหม่ต่อท้าย ส่วน SELECTCOLUMNS จะ ‘ทิ้ง’ คอลัมน์เดิมทั้งหมด แล้วสร้างตารางใหม่ที่มีเฉพาะคอลัมน์ที่คุณระบุ ส่วนตัวผมใช้ ADDCOLUMNS ตอนต้องการเก็บข้อมูลเดิมไว้ แต่อยากเพิ่มข้อมูลใหม่เข้ามา
ปัญหานี้เจอบ่อยครับ 😅 สาเหตุหลักคือการใช้ฟังก์ชัน Aggregate (เช่น SUM) โดยไม่มี CALCULATE ข้าง หรือไม่ใช้ RELATED ในการเลือกคอลัมน์จากตาราง Related ถ้าจะใช้ SUM ต้องครอบด้วย CALCULATE เพื่อให้รู้ว่าต้องกรองข้อมูลตามแถวปัจจุบันนะครับ
ได้ทั้งสองแบบ! ใช้ใน Measures ได้ (เหมาะสำหรับสร้างตารางชั่วคราว) และใช้ใน Calculated Columns ของตารางได้ด้วย แต่ใน DirectQuery mode ไม่สนับสนุน Calculated Columns และ RLS rules ที่ใช้ ADDCOLUMNS
ใช่ ต้องใส่เครื่องหมายคำพูด ” ” เสมอ ถึงแม้ชื่อจะไม่มีช่องว่างก็ตาม ถ้าชื่อคอลัมน์มีช่องว่างหรืออักขระพิเศษ ให้ครอบด้วยวงเล็บเหลี่ยม [] แต่ส่วนตัวผมชอบใช้เครื่องหมายคำพูด เพราะมันชัดเจนว่า column ใหม่นี้จริง ๆ แล้วคือการคำนวณเท่านั้น 😎
ADDCOLUMNS ใช้สำหรับสร้างตารางชั่วคราว (Virtual Table) ที่มีคอลัมน์ใหม่เพิ่มเข้ามา โดยคำนวณค่าในแต่ละแถวของตาราง
.
ที่เจ๋งคือ ADDCOLUMNS ไม่ทิ้งคอลัมน์เดิมออกมาเลย เอาแบบเพิ่มต่อท้ายเข้ามา ซึ่งต่างจาก SELECTCOLUMNS ที่เลือกเฉพาะคอลัมน์ที่ต้องการ
.
ส่วนตัวผมใช้ ADDCOLUMNS บ่อยเมื่อต้องการสร้างตาราง helper มาใช้ใน SUMX หรือ FILTER เพราะมันเสริมข้อมูลเดิมได้อย่างไม่ทำลายโครงสร้างตาราง 😎
.
แต่ที่ต้องระวังคือฟังก์ชันนี้สร้าง Row Context เท่านั้น ถ้าคุณเขียนสูตร Aggregate (เช่น SUM) โดยไม่มี CALCULATE จะคำนวณยอดรวมทั้งตารางเลย ไม่ใช่แถวปัจจุบัน