Thep Excel

ADDCOLUMNSเพิ่มคอลัมน์คำนวณให้ตาราง

ADDCOLUMNS เป็นฟังก์ชัน table transformation ที่ใช้สำหรับเพิ่มคอลัมน์ใหม่ (Calculated Columns) เข้าไปในตารางที่มีอยู่เดิม โดยคำนวณค่าในแต่ละแถวผ่าน Row Context และส่งคืนตารางเดิมพร้อมคอลัมน์ใหม่ต่อท้าย

fx
=ADDCOLUMNS(<table>, <name>, <expression>[, <name>, <expression>]…)

ความนิยม7/10
ความยาก5/10
ประโยชน์7/10

อัปเดต 13 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด คำอธิบาย
table Table ตารางต้นฉบับ หรือตารางที่ได้จาก DAX Expression (เช่น FILTER, ALL, VALUES เป็นต้น)
name Text ชื่อของคอลัมน์ใหม่ที่ต้องการสร้าง ต้องใส่ในเครื่องหมายคำพูด “…”
expression Scalar สูตร DAX ที่ใช้คำนวณค่าในคอลัมน์ใหม่ จะถูกคำนวณในแต่ละแถวของตาราง (Row Context)

Additional Notes

ADDCOLUMNS ใช้สำหรับสร้างตารางชั่วคราว (Virtual Table) ที่มีคอลัมน์ใหม่เพิ่มเข้ามา โดยคำนวณค่าในแต่ละแถวของตาราง
.
ที่เจ๋งคือ ADDCOLUMNS ไม่ทิ้งคอลัมน์เดิมออกมาเลย เอาแบบเพิ่มต่อท้ายเข้ามา ซึ่งต่างจาก SELECTCOLUMNS ที่เลือกเฉพาะคอลัมน์ที่ต้องการ
.
ส่วนตัวผมใช้ ADDCOLUMNS บ่อยเมื่อต้องการสร้างตาราง helper มาใช้ใน SUMX หรือ FILTER เพราะมันเสริมข้อมูลเดิมได้อย่างไม่ทำลายโครงสร้างตาราง 😎
.
แต่ที่ต้องระวังคือฟังก์ชันนี้สร้าง Row Context เท่านั้น ถ้าคุณเขียนสูตร Aggregate (เช่น SUM) โดยไม่มี CALCULATE จะคำนวณยอดรวมทั้งตารางเลย ไม่ใช่แถวปัจจุบัน

How it works

การสร้าง Date Table มาตรฐาน

ใช้ ADDCOLUMNS เพื่อเพิ่มคอลัมน์ Year, Month, Quarter, Fiscal Year เข้าไปในตารางที่สร้างจาก CALENDAR() หรือ CALENDARAUTO() เพื่อใช้เป็น Dimension Table หลักในโมเดล

การ Debug ค่าใน Virtual Table

เมื่อเขียนสูตรซับซ้อน เราสามารถใช้ ADDCOLUMNS สร้างตารางทดสอบเพื่อดูค่าที่คำนวณได้ในแต่ละแถว ก่อนที่จะนำไป Aggregate ด้วย SUMX หรือ AVERAGEX

Examples

ตัวอย่างที่ 1: เพิ่มคอลัมน์คำนวณราคาสุทธิ (สร้างตาราง helper)ADDCOLUMNS( Sales, "NetPrice", [Quantity] * [Price] )

สร้างคอลัมน์ใหม่ชื่อ NetPrice โดยคำนวณจากการคูณ Quantity กับ Price ในแต่ละแถว Row Context จะคำนวณอัตโนมัติสำหรับแต่ละแถว

fx
=ADDCOLUMNS(
Sales,
"NetPrice", [Quantity] * [Price]
)

ผลลัพธ์ตาราง Sales ที่มีคอลัมน์ NetPrice เพิ่มเข้ามา (รวม Quantity, Price, NetPrice)
ตัวอย่างที่ 2: เพิ่มหลายคอลัมน์พร้อมกัน (ส่วนลด และ ราคาสุดท้าย)ADDCOLUMNS( Sales, "DiscountAmount", [Amount] * 0.1, "FinalPrice", [Amount] * 0.9 )

เพิ่มสองคอลัมน์พร้อมกัน โดยใช้ช่วง name-expression pairs แต่ละคู่ ADDCOLUMNS จะคำนวณในลำดับ ดังนั้น FinalPrice สามารถอ้างอิง Amount ได้เลย

fx
=ADDCOLUMNS(
Sales,
"DiscountAmount", [Amount] * 0.1,
"FinalPrice", [Amount] * 0.9
)

ผลลัพธ์ตาราง Sales ที่มีคอลัมน์ DiscountAmount และ FinalPrice เพิ่มเข้ามา
ตัวอย่างที่ 3: ใช้กับ FILTER และ RELATED (คำนวณยอดขายต่อสินค้า)ADDCOLUMNS( FILTER(Products, Products[Category] = "Electronics"), "TotalSales", CALCULATE(SUM(Sales[Amount])) )

สำคัญ! เพราะใช้ CALCULATE ร่วมกับ SUM ภายในแถว จาก Row Context (Products[ProductID]) ของแต่ละแถว CALCULATE จะรู้ว่าต้องกรองยอดขายสำหรับสินค้านั้นเท่านั้น มันใช้ Filter Context Transition

fx
=ADDCOLUMNS(
FILTER(Products, Products[Category] = "Electronics"),
"TotalSales", CALCULATE(SUM(Sales[Amount]))
)

ผลลัพธ์ตาราง Products ที่ filter เฉพาะ Category = Electronics พร้อมคอลัมน์ TotalSales
ตัวอย่างที่ 4: ใช้กับ GENERATE เพื่อสร้างตารางจำลอง (Simulation Table)ADDCOLUMNS( GENERATE( VALUES(Products[ProductID]), ROW("SalesAmount", CALCULATE(SUM(Sales[Amount]))) ), "SalesPct", DIVIDE([SalesAmount], CALCULATE(SUM(Sales[Am…

ประยุกต์ใช้ชั้นสูง: GENERATE สร้างจำลองตาราง สูตรแรก ROW ทำให้ได้ SalesAmount แล้ว ADDCOLUMNS เข้ามาเพิ่ม SalesPct โดยหารด้วย ALL(Products) เพื่อได้สัดส่วนต่อยอดขายรวมทั้งหมด

fx
=ADDCOLUMNS(
GENERATE(
VALUES(Products[ProductID]),
ROW("SalesAmount", CALCULATE(SUM(Sales[Amount])))
),
"SalesPct", DIVIDE([SalesAmount], CALCULATE(SUM(Sales[Amount]), ALL(Products)), 0)
)

ผลลัพธ์ตารางที่มีโครงสร้าง ProductID, SalesAmount, SalesPct พร้อมคำนวณสัดส่วน

FAQs

ADDCOLUMNS ต่างจาก SELECTCOLUMNS อย่างไร?+

ADDCOLUMNS จะ 'เก็บ' คอลัมน์เดิมของตารางไว้ทั้งหมด และเพิ่มคอลัมน์ใหม่ต่อท้าย ส่วน SELECTCOLUMNS จะ 'ทิ้ง' คอลัมน์เดิมทั้งหมด แล้วสร้างตารางใหม่ที่มีเฉพาะคอลัมน์ที่คุณระบุ ส่วนตัวผมใช้ ADDCOLUMNS ตอนต้องการเก็บข้อมูลเดิมไว้ แต่อยากเพิ่มข้อมูลใหม่เข้ามา

ทำไมค่าที่คำนวณได้บางครั้งเท่ากันทุกแถว?+

ปัญหานี้เจอบ่อยครับ 😅 สาเหตุหลักคือการใช้ฟังก์ชัน Aggregate (เช่น SUM) โดยไม่มี CALCULATE ข้าง หรือไม่ใช้ RELATED ในการเลือกคอลัมน์จากตาราง Related ถ้าจะใช้ SUM ต้องครอบด้วย CALCULATE เพื่อให้รู้ว่าต้องกรองข้อมูลตามแถวปัจจุบันนะครับ

ADDCOLUMNS ทำงานได้บน Calculated Columns หรือแค่ Measures?+

ได้ทั้งสองแบบ! ใช้ใน Measures ได้ (เหมาะสำหรับสร้างตารางชั่วคราว) และใช้ใน Calculated Columns ของตารางได้ด้วย แต่ใน DirectQuery mode ไม่สนับสนุน Calculated Columns และ RLS rules ที่ใช้ ADDCOLUMNS

ฉันต้องใช้เครื่องหมายคำพูด " " สำหรับชื่อคอลัมน์ใหม่หรือไม่?+

ใช่ ต้องใส่เครื่องหมายคำพูด " " เสมอ ถึงแม้ชื่อจะไม่มีช่องว่างก็ตาม ถ้าชื่อคอลัมน์มีช่องว่างหรืออักขระพิเศษ ให้ครอบด้วยวงเล็บเหลี่ยม [] แต่ส่วนตัวผมชอบใช้เครื่องหมายคำพูด เพราะมันชัดเจนว่า column ใหม่นี้จริง ๆ แล้วคือการคำนวณเท่านั้น 😎

Resources & Related

ฟังก์ชันที่ผู้เขียนโยงไว้กับ ADDCOLUMNS จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้ADDCOLUMNSTable manipulation
Table manipulation (12)
CROSSJOIN

CROSSJOIN สร้างตารางใหม่โดยการรวมแถวทั้งหมดจากตารางที่ระบุ โดยสร้างทุก Combination ที่เป็นไปได้ ผลลัพธ์คือตารางที่มีจำนวนแถวเท่ากับผลคูณของจำนวนแถวของแต่ละตาราง

CURRENTGROUP

CURRENTGROUP คืนตารางย่อยของกลุ่มปัจจุบันและใช้ได้เฉพาะภายใน GROUPBY ช่วยให้คำนวณค่าที่อิงแถวภายในกลุ่มได้ เช่น SUMX/COUNTROWS/ MAXX ของกลุ่มนั้น

DATATABLE

DATATABLE สร้างตารางแบบ hardcode ด้วยข้อมูลคงที่ โดยระบุชื่อคอลัมน์ ชนิดข้อมูล และค่าของแต่ละแถว เหมาะสำหรับตารางอ้างอิงเล็กๆ เช่น lookup table หรือข้อมูลตัวอย่าง

GENERATE

GENERATE วนทีละแถวใน Table1 แล้วประเมิน Table2 ในบริบทของแถวนั้น (row context) จากนั้นรวมผลทั้งหมดเป็นตารางเดียว ถ้า Table2 ว่างเปล่าในรอบไหน แถวนั้นจาก Table1 จะถูกตัดออก (ต่างจาก GENERATEALL)

GENERATEALL

GENERATEALL วนแถวของตาราง 1 แล้วสร้าง Cartesian product กับผลลัพธ์ของตาราง 2 โดยคงแถวที่ไม่มีข้อมูลย่อย ต่างจาก GENERATE ตรงที่ไม่ตัดแถวหลักออก

GENERATESERIES

GENERATESERIES สร้างตารางคอลัมน์เดียวที่เป็นลำดับตัวเลขจาก StartValue ถึง EndValue ด้วย increment ที่กำหนดได้ เหมาะกับตารางช่วย parameter table หรือสร้างชุดตัวเลขสำหรับ what-if analysis

GROUPBY

GROUPBY สร้างตารางสรุปโดยจัดกลุ่มตามคอลัมน์ที่กำหนด และเพิ่มคอลัมน์คำนวณแบบกลุ่มต่อกลุ่มได้ โดยใช้ CURRENTGROUP() เข้าถึงแถวภายในกลุ่ม เหมาะกับการคำนวณซ้อนหรือคำนวณจากคอลัมน์ชั่วคราว (local columns)

NATURALINNERJOIN

NATURALINNERJOIN ทำ inner join ระหว่าง LeftTable และ RightTable โดยใช้คอลัมน์ชื่อเดียวกันเป็นคีย์การจับคู่ คืนผลลัพธ์เฉพาะแถวที่จับคู่ได้ทั้งสองตาราง และมักใช้ร่วมกับ SELECTCOLUMNS เพื่อจัดชื่อคอลัมน์ให้ตรงกัน

SELECTCOLUMNS

สร้างตารางใหม่โดยเลือกเฉพาะคอลัมน์ที่ต้องการจากตารางต้นฉบับและเพิ่มคอลัมน์ที่คำนวณได้ ต่างจาก ADDCOLUMNS ตรงที่ SELECTCOLUMNS เริ่มจากตารางว่างแล้วเพิ่มเฉพาะคอลัมน์ที่ระบุ ทำให้สามารถปรับโครงสร้างตารางและเลือกข้อมูลที่จำเป็นได้อย่างยืดหยุ่น

SUMMARIZE

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

SUMMARIZECOLUMNS เป็นฟังก์ชันหลักสำหรับสร้างตารางสรุปผล โดยจัดกลุ่มตามคอลัมน์ที่กำหนด พร้อมเพิ่มคอลัมน์คำนวณจากเมเชอร์ และสามารถใส่เงื่อนไขกรองได้ทันที

TOPN

คืนตาราง Top N แถวจากตารางที่กำหนด โดยเรียงตามนิพจน์หนึ่งตัวหรือมากกว่า สามารถระบุทิศทางการเรียงลำดับแยกต่างหากสำหรับแต่ละเกณฑ์

Filter (3)
CALCULATE

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

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

FILTER ใช้กรองแถวในตารางตามเงื่อนไขที่ซับซ้อน โดยวนลูปทุกแถวและประเมินเงื่อนไข เหมาะกับการกรองด้วย Measure หรือ Expression ซึ่ง Boolean Expression ทำไม่ได้ แต่ต้องระวังเรื่อง Performance เพราะเป็น Iterator Function ที่ช้ากว่า Boolean Expression ดังนั้นควรใช้เฉพาะเมื่อจำเป็น และอย่าใช้ FILTER กับ RELATED เพื่อกรองข้ามตาราง ให้กรองที่ Dimension Table โดยตรงแทน

Date and Time (2)
CALENDAR

CALENDAR ใช้สำหรับสร้างตารางวันที่ครบถ้วนตั้งแต่วันเริ่มต้นถึงวันสิ้นสุดโดยไม่มีช่องว่าง เหมาะสำหรับสร้างตารางวันที่โครงสร้างพื้นฐาน (Date Dimension) ที่ใช้ร่วมกับ Time Intelligence Function

CALENDARAUTO

CALENDARAUTO สร้างตารางวันที่อัตโนมัติโดยอิงช่วงวันที่ที่พบในโมเดล และสามารถกำหนดเดือนสิ้นสุดปีบัญชีได้ เหมาะกับการสร้าง Date table แบบเร็ว ๆ แต่ควรระวังค่าวันที่ผิดปกติในข้อมูล

Other (1)
EARLIER

EARLIER คืนค่าของคอลัมน์ใน Row Context ชั้นนอก (Outer Row Context) เพื่อให้คอลัมน์คำนวณสามารถอ้างอิงค่า “ของแถวปัจจุบัน” ระหว่างการวนซ้อน (เช่น FILTER ภายใน Calculated Column) ได้

Relationship (1)
RELATED

RELATED คืนค่า scalar value (ค่าเดี่ยว) จากคอลัมน์ในตารางที่มีความสัมพันธ์แบบ many-to-one โดยอาศัย relationship ที่กำหนดไว้ในโมเดล ฟังก์ชันนี้ต้องการ row context และสามารถ traverse relationship chain ข้ามหลายขั้นได้ตราบใดที่ทุก relationship อยู่ในทิศทางเดียวกัน

Aggregation (1)
SUMX

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

อีเมลของคุณจะไม่ถูกเผยแพร่