Table.AddColumn เพิ่มคอลัมน์ใหม่ลงในตารางโดยคำนวณค่าจากฟังก์ชันที่กำหนด ใช้คำสั่ง each เพื่ออ้างอิงข้อมูลในแต่ละแถว เช่น each [Price] * [Quantity] สามารถระบุชนิดข้อมูลได้เพื่อเพิ่มประสิทธิภาพและป้องกันข้อผิดพลาดจากการคาดเดาชนิดข้อมูล ทำงานแบบทีละแถวและเหมาะสำหรับสร้างคอลัมน์คำนวณ รวมข้อมูล ใช้เงื่อนไข และการแปลงข้อมูลต่างๆ ใช้ร่วมกับฟังก์ชัน Table.TransformColumns สำหรับแก้ไขคอลัมน์เดิม Table.AddIndexColumn สำหรับเพิ่มหมายเลขลำดับ Table.SelectRows สำหรับกรองแถว Table.FromRecords สำหรับสร้างตารางจากข้อมูล Text.Combine สำหรับรวมข้อความ Number.Round สำหรับปัดเศษ Date.Year สำหรับดึงค่าปี และ Text.Upper สำหรับแปลงเป็นตัวพิมพ์ใหญ่ เพื่อสร้างกระบวนการแปลงข้อมูลที่สมบูรณ์
| อาร์กิวเมนต์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
| table | table | ตารางข้อมูลต้นฉบับที่ต้องการเพิ่มคอลัมน์ใหม่เข้าไป สามารถเป็นตารางที่มาจากแหล่งข้อมูล สร้างด้วย Table.FromRecords หรือมาจากการแปลงข้อมูลขั้นก่อนหน้า | |
| newColumnName | text | ชื่อคอลัมน์ใหม่ที่ต้องการสร้างขึ้นมา ต้องเป็นข้อความและไม่ซ้ำกับชื่อคอลัมน์ที่มีอยู่แล้วในตาราง หากชื่อซ้ำกันจะเกิดข้อผิดพลาด | |
| columnGenerator | function | ฟังก์ชันสำหรับคำนวณค่าในแต่ละแถว โดยส่วนใหญ่ใช้คำสั่ง each เพื่ออ้างอิงคอลัมน์ในแถวปัจจุบัน ตัวอย่างเช่น each [Price] + [Tax] คำสั่ง each เป็นรูปแบบย่อสำหรับ (_) => expression โดย _ คือแถวปัจจุบัน และ [ColumnName] คือการเข้าถึงค่าจากคอลัมน์นั้นในแถวปัจจุบัน สามารถใช้ฟังก์ชันได้ทุกตัว เช่น Text.Upper สำหรับแปลงเป็นตัวพิมพ์ใหญ่, Number.Round สำหรับปัดเศษตัวเลข, Date.Year สำหรับดึงค่าปีจากวันที่ | |
| [columnType]ไม่บังคับ | nullable type | null | ชนิดข้อมูลของคอลัมน์ใหม่ เช่น type number สำหรับตัวเลข, type text สำหรับข้อความ, type date สำหรับวันที่, type logical สำหรับจริงเท็จ ถ้าไม่ระบุระบบจะคาดเดาชนิดข้อมูลจากค่าที่คำนวณได้ แนะนำให้ระบุเพื่อเพิ่มประสิทธิภาพโดยลดเวลาการคาดเดาชนิดข้อมูลและป้องกันข้อผิดพลาดจากชนิดข้อมูลที่ไม่ตรงกัน โดยเฉพาะกับตารางขนาดใหญ่ |
[ ] = อาร์กิวเมนต์ที่ไม่บังคับ
Table.AddColumn เป็นหนึ่งในฟังก์ชันที่ผมใช้บ่อยที่สุดตอนแปลงข้อมูลใน Power Query เลยก็ว่าได้ 😎 ทำหน้าที่เพิ่มคอลัมน์ใหม่ลงในตารางโดยคำนวณค่าจากฟังก์ชันที่เรากำหนด โดยสามารถอ้างอิงข้อมูลจากคอลัมน์อื่นในแต่ละแถวได้ด้วย each keyword และรูปแบบ [ColumnName]
.
ซึ่งทำให้เหมาะมากสำหรับการสร้างคอลัมน์คำนวณ การรวมข้อมูลจากหลายคอลัมน์ การใช้เงื่อนไขตามกฎธุรกิจ และการแปลงข้อมูลในกระบวนการ ETL ต่างๆ ฟังก์ชันนี้ใช้งานร่วมกับ Table.TransformColumns สำหรับแก้ไขคอลัมน์เดิม Table.SelectRows สำหรับกรองแถวตามเงื่อนไข Table.AddIndexColumn สำหรับเพิ่มหมายเลขลำดับ และ Table.RenameColumns สำหรับเปลี่ยนชื่อคอลัมน์
การทำงานของฟังก์ชันนี้เป็นแบบทีละแถว โดยจะวนซ้ำทุกแถวในตารางและเรียกใช้ฟังก์ชันคำนวณเพื่อหาค่าสำหรับคอลัมน์ใหม่ในแต่ละแถว
.
ซึ่งต่างจาก Table.TransformColumns ที่แก้ไขคอลัมน์เดิม ฟังก์ชัน Table.AddColumn จะสร้างคอลัมน์ใหม่โดยไม่กระทบต่อคอลัมน์ที่มีอยู่ ทำให้สามารถเก็บทั้งข้อมูลต้นฉบับและข้อมูลที่คำนวณไว้พร้อมกันได้
.
ภายในฟังก์ชันสามารถใช้ฟังก์ชันอื่นๆ ได้หลากหลาย เช่น Text.Combine สำหรับรวมข้อความ Number.Round สำหรับปัดเศษทศนิยม Date.Year สำหรับดึงปี List.Sum สำหรับรวมค่าในลิสต์ และ Text.Upper สำหรับแปลงเป็นตัวพิมพ์ใหญ่ เป็นต้น
สร้างคอลัมน์ที่คำนวณจากคอลัมน์อื่นใน table เช่น ยอดรวม = ราคา + ค่าจัดส่ง, กำไร = รายได้ – ต้นทุน, ส่วนลด = ราคา × เปอร์เซ็นต์ส่วนลด เหมาะสำหรับการวิเคราะห์ทางการเงิน sales reporting และ business intelligence
Combine ข้อมูลจากหลายคอลัมน์เป็นคอลัมน์เดียว เช่น ชื่อเต็ม = ชื่อ + นามสกุล, ที่อยู่เต็ม = บ้านเลขที่ + ตำบล + จังหวัด + รหัสไปรษณีย์, SKU = รหัสสินค้า + รหัสสี + รหัสขนาด ใช้ Text.Combine สำหรับ text concatenation และระบุ delimiter ได้
สร้างคอลัมน์ที่จัดกลุ่มข้อมูลตามเงื่อนไข เช่น ระดับยอดขาย (สูง/ปานกลาง/ต่ำ), สถานะลูกค้า (ใหม่/เก่า/VIP), age group (0-18, 19-35, 36-50, 51+), กลุ่มราคา (budget/mid-range/premium) ใช้ if-then-else หรือ nested conditions
แปลงข้อมูลในระหว่าง ETL pipeline เช่น แปลง raw data เป็น format ที่ต้องการ, คำนวณ derived metrics, สร้าง flag columns สำหรับ data quality checks, normalize ข้อมูล, หรือสร้าง surrogate keys ใช้ร่วมกับ Table.SelectRows และ Table.TransformColumns เพื่อ data cleansing workflow ที่สมบูรณ์
ตัวอย่างนี้เพิ่มคอลัมน์ TotalPrice โดยคำนวณจาก [Price] + [Shipping] ในแต่ละแถว
คำสั่ง each เป็นแบบย่อสำหรับ function ที่รับแถวเป็น parameter และ [ColumnName] คือการดึงค่าจากคอลัมน์นั้นในแถวปัจจุบัน ส่วน type number บังคับให้ผลลัพธ์เป็นตัวเลขและช่วย optimize performance ด้วย
ตัวอย่างนี้ใช้ Text.Combine ภายใน columnGenerator เพื่อรวมข้อความจากหลายคอลัมน์ {[FirstName], [LastName]} คือ list ของค่าที่ต้องการรวม และ " " คือ delimiter (space) ที่ใช้คั่นระหว่างค่า
Text.Combine ยืดหยุ่นกว่า & operator เพราะรองรับการจัดการ null values และ custom delimiters ได้ดีกว่าครับ 😎
ตัวอย่างนี้ใช้ if-then-else เพื่อสร้าง conditional logic ตัวอย่างแสดงการเพิ่ม 2 คอลัมน์ตามลำดับ
คอลัมน์แรก (Category) เช็คว่า [Amount] > 100 หรือไม่ คอลัมน์ที่สอง (Priority) ใช้ค่าจากคอลัมน์ Category ที่สร้างไปแล้ว (combined condition)
Pattern นี้เหมาะมากสำหรับ business rules ที่ซับซ้อน เช่น customer segmentation หรือ sales tier classification
ตัวอย่างนี้แสดงการใช้ custom function (CalculateTax) ภายใน let block และเรียกใช้ใน columnGenerator ซึ่งช่วยให้ logic ซับซ้อนอ่านง่ายและ reusable ได้
ขั้นตอนแรกกำหนด function สำหรับคำนวณภาษีพร้อม Number.Round เพื่อจำกัดทศนิยม จากนั้นเพิ่มคอลัมน์ TaxAmount โดยเรียก CalculateTax([Price], [TaxRate]) สุดท้ายเพิ่มคอลัมน์ FinalPrice โดยรวมราคากับภาษี
ส่วนตัวผมชอบ pattern นี้มากครับ เพราะทำให้โค้ดอ่านง่ายและ maintain ได้ดีกว่าการยัดทุกอย่างไว้ใน columnGenerator เดียว 💡
ตัวอย่าง advanced นี้แสดง 3 techniques ที่ผมใช้บ่อยมากครับ:
(1) Nested if-then-else conditions เพื่อกำหนด discount rate ตาม customer type และ amount (business rules ที่ซับซ้อน)
(2) Chain multiple Table.AddColumn calls โดยแต่ละคอลัมน์ใหม่สามารถอ้างอิงคอลัมน์ที่สร้างไปแล้ว (เช่น DiscountAmount ใช้ DiscountRate)
(3) ใช้ Date functions (Date.QuarterOfYear) และ Text.From สำหรับ type conversion ภายใน columnGenerator
Pattern นี้เป็น standard ใน ETL pipelines และ data transformation workflows ที่ต้องการ calculated metrics หลายชั้น เรียกได้ว่าเป็นเทคนิคหลักของการทำ Power Query เลยก็ว่าได้ 😎
คำสั่ง each เป็นรูปแบบย่อสำหรับฟังก์ชันที่ไม่มีชื่อซึ่งรับพารามิเตอร์เดียวชื่อ _ (underscore) การเขียน each [Price] + [Tax] มีความหมายเท่ากับ (_) => _[Price] + _[Tax] โดย _ แทนแถวปัจจุบัน และ [ColumnName] คือการเข้าถึงค่าในคอลัมน์นั้นจากแถวปัจจุบันโดยอัตโนมัติ ข้อดีของ each คือทำให้โค้ดอ่านง่ายและสั้นกว่า โดยเฉพาะในฟังก์ชันตารางที่ทำงานทีละแถว
ไม่บังคับครับ แต่ส่วนตัวผมแนะนำให้ระบุเสมอเพื่อเพิ่มประสิทธิภาพและป้องกันข้อผิดพลาด 💡
ถ้าไม่ระบุ Power Query จะคาดเดาชนิดข้อมูลจากค่าที่คำนวณได้ ซึ่งใช้เวลาและอาจไม่ตรงความต้องการ การระบุชนิดข้อมูลช่วย:
(1) ลดเวลาการคาดเดาชนิดข้อมูลโดยเฉพาะในตารางขนาดใหญ่หลายพันหลายหมื่นแถว
(2) ป้องกันข้อผิดพลาดจากชนิดข้อมูลที่ไม่ตรงกันเมื่อข้อมูลไม่สอดคล้องกับที่คาดหวัง
(3) ทำให้แผนการประมวลผลชัดเจนและคาดการณ์ได้
สำหรับชนิดข้อมูลที่ใช้บ่อย: type number สำหรับตัวเลข, type text สำหรับข้อความ, type date สำหรับวันที่, type logical สำหรับจริงเท็จ, type datetime สำหรับวันเวลา
ได้ สามารถใช้ฟังก์ชันทุกตัวภายในฟังก์ชันคำนวณ เช่น ฟังก์ชันข้อความ (Text.Upper สำหรับแปลงเป็นตัวพิมพ์ใหญ่, Text.Combine สำหรับรวมข้อความ, Text.Length สำหรับนับจำนวนตัวอักษร), ฟังก์ชันตัวเลข (Number.Round สำหรับปัดเศษ, Number.Abs สำหรับค่าสัมบูรณ์, Number.Mod สำหรับหารเอาเศษ), ฟังก์ชันวันที่ (Date.Year สำหรับดึงปี, Date.AddDays สำหรับเพิ่มวัน, Date.DayOfWeek สำหรับหาวันในสัปดาห์), ฟังก์ชันลอจิก (Logical.And, Logical.Or), ฟังก์ชันลิสต์ (List.Sum สำหรับรวมค่า, List.Count สำหรับนับจำนวน) และอื่นๆ ตัวอย่างการใช้งาน: each Text.Upper([Name]) แปลงชื่อเป็นตัวพิมพ์ใหญ่, each Number.Round([Price] * 1.07, 2) คำนวณราคารวมภาษีและปัดเศษ, each Date.Year([OrderDate]) ดึงปีจากวันที่สั่งซื้อ, each List.Sum([Items]) รวมค่าในลิสต์สินค้า ข้อจำกัดเดียวคือฟังก์ชันต้องคืนค่าที่เหมาะสมสำหรับเซลล์เดียวในคอลัมน์ ไม่ใช่ตารางหรือโครงสร้างที่ซับซ้อน
จะเกิด error "Expression.Error: The field 'ColumnName' of the record wasn't found" ทันที 😭
ต้องตรวจสอบให้แน่ใจว่า:
(1) ชื่อคอลัมน์ใน [ColumnName] ถูกต้องและ match กับคอลัมน์ใน table (case-sensitive นะครับ)
(2) คอลัมน์ที่อ้างอิงมีอยู่จริงใน table ณ ขั้นตอนนั้น (ถ้า chain หลาย transformations ต้องเช็คว่าคอลัมน์ยังไม่ถูกลบไป)
(3) ถ้าคอลัมน์อาจไม่มีใน some cases สามารถใช้ Record.HasFields หรือ try…otherwise เพื่อ handle gracefully
คำถามนี้เจอบ่อยมากครับ 😅 ต่างกันที่:
Table.AddColumn สร้างคอลัมน์ใหม่โดยไม่แก้ไขคอลัมน์เดิม (เก็บทั้งข้อมูลต้นฉบับและข้อมูลใหม่)
ส่วน Table.TransformColumns แก้ไขค่าในคอลัมน์เดิม (replace values in-place)
ใช้ AddColumn เมื่อ: (1) ต้องการเก็บทั้งค่าเดิมและค่าใหม่ เช่น Price และ PriceWithTax, (2) คำนวณจากหลายคอลัมน์ เช่น Total = Price + Shipping, (3) สร้าง derived columns สำหรับ analysis
ใช้ TransformColumns เมื่อ: (1) ต้องการ clean data in-place เช่น trim spaces, uppercase, (2) แปลง type เช่น text → number, (3) ไม่ต้องการเก็บค่าเดิม
หลักคิด: AddColumn = add new, TransformColumns = modify existing 💡
ต้องเรียก Table.AddColumn หลายครั้ง (chain calls) หรือใช้ let…in เพื่อ add คอลัมน์ทีละตัวครับ
เช่น: AddCol1 = Table.AddColumn(…), AddCol2 = Table.AddColumn(AddCol1, …), AddCol3 = Table.AddColumn(AddCol2, …)
ข้อดีของ chaining คือคอลัมน์ที่สร้างทีหลังสามารถอ้างอิงคอลัมน์ที่สร้างก่อนหน้าได้ (เช่น FinalPrice อ้างอิง TaxAmount)
ถ้าต้องการเพิ่มหลายคอลัมน์โดยไม่ขึ้นต่อกัน อาจพิจารณา custom function หรือ Table.FromColumns + Table.Combine patterns แต่โดยทั่วไป chaining Table.AddColumn เป็นวิธีที่ชัดเจนและ maintainable ที่สุด 😎
columnGenerator function ทำงานกับทุกแถว รวมถึงแถวที่มี null values ด้วย
ถ้าไม่ handle null พฤติกรรมขึ้นกับ operation:
(1) Arithmetic (each [A] + [B]) → null ถ้า A หรือ B เป็น null
(2) Text concatenation (each [A] & [B]) → null ถ้าฝั่งใดฝั่งหนึ่งเป็น null
(3) Comparisons (each [A] > 100) → error ถ้า A เป็น null 😭
วิธี handle: ใช้ if [Column] null then … else … หรือใช้ ?? operator (null coalescing) เช่น each ([Price] ?? 0) * ([Qty] ?? 1) หรือใช้ try…otherwise เช่น each try [Price] + [Tax] otherwise 0
ส่วนตัวผมชอบใช้ ?? operator เพราะอ่านง่ายและสั้นดีครับ 💡
ฟังก์ชันที่ผู้เขียนโยงไว้กับ Table.AddColumn จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
Table.AddIndexColumn ใช้สำหรับเพิ่มคอลัมน์ที่มีลำดับเลขให้กับตาราง ช่วยให้สามารถกำหนดหมายเลขแถวตามลำดับได้
Table.AddMatchColumn เพิ่มคอลัมน์ใหม่ที่มีค่าจากการแมตช์แถวในตารางอื่น โดยค้นหาค่าที่ตรงกับคีย์ เหมือน VLOOKUP แต่ทำงานโดยตรงบนตารางทั้งหมด
Table.Combine ใช้สำหรับรวม list ของ table เข้าเป็น table เดียว ยับยั้ง append ตัว 1 แถวหลาย ๆ ตารางพร้อมกัน
สร้างคอลัมน์ใหม่โดยคัดลอกค่ามาจากคอลัมน์ที่มีอยู่เดิม (Duplicate)
Table.ExpandListColumn ใช้สำหรับขยายคอลัมน์ที่เก็บข้อมูลแบบ List ให้เป็นแถวแยก โดยแต่ละรายการใน List จะกลายเป็นแถวใหม่ ส่วนข้อมูลในคอลัมน์อื่นจะถูกทำซ้ำตามจำนวน
Table.FillDown เติมเต็มค่า null ด้วยค่าจากแถวด้านบน (forward fill) เหมาะสำหรับข้อมูลที่มีการ merge cell หรือจัดกลุ่มข้อมูลแบบ hierarchical ทำให้ได้ตารางที่สมบูรณ์พร้อมใช้ต่อได้เลย
แปลง List ของ Record เป็นตาราง โดยแต่ละ Record กลายเป็นหนึ่งแถว เหมาะสำหรับข้อมูลจาก API หรือ JSON
Table.FromRows สร้างตารางจาก List ของ List โดยแต่ละ List ย่อยแทนข้อมูลในแถวหนึ่ง คล้ายกับการ transpose ข้อมูลแบบแถว-คอลัมน์ แต่ทำให้เป็นตารางจริงในทันที
Table.RemoveColumns ใช้ลบคอลัมน์เดียวหรือหลายคอลัมน์จาก table ครั้งเดียว เป็นวิธีที่สะดวกเมื่อต้องการลบ column ที่ไม่ต้องการ เช่น unwanted columns จากการโหลด Excel หรือ column ชั่วคราวหลังใช้คำนวณเสร็จ
Table.RenameColumns ใช้สำหรับเปลี่ยนชื่อคอลัมน์หนึ่งหรือหลายคอลัมน์ในตารางพร้อมกัน โดยส่งผ่าน list ของ rename pairs {ชื่อเก่า, ชื่อใหม่}
Table.ReplaceValue ใช้สำหรับค้นหาและแทนที่ค่าในตารางได้หลายวิธี ตั้งแต่แทนที่ค่าทั้งหมดไปจนถึงแทนที่แบบมีเงื่อนไข
Table.SelectRows เป็นฟังก์ชันสำหรับกรองตาราง (filter table) ใน Power Query โดยใช้ฟังก์ชันเงื่อนไข (condition function) เพื่อตรวจสอบแต่ละแถว ถ้าเงื่อนไขคืนค่า true จะเก็บแถวนั้นไว้ ถ้าเป็น false จะตัดทิ้ง สามารถใช้ keyword 'each' ร่วมกับการอ้างอิงคอลัมน์ด้วย [ColumnName] เพื่อเขียนเงื่อนไขได้สะดวก รองรับการกรองตามตัวเลข ข้อความ วันที่ การตรวจสอบค่า null และเงื่อนไขที่ซับซ้อนด้วย and/or operators ฟังก์ชันนี้รองรับ Query Folding ซึ่งช่วยเพิ่มประสิทธิภาพเมื่อทำงานกับ data source ขนาดใหญ่
Table.TransformColumns ใช้สำหรับแปลงข้อมูลในคอลัมน์โดยใช้ฟังก์ชันที่กำหนดไว้ แต่ละคอลัมน์สามารถมีการแปลงแตกต่างกันได้ รองรับการเปลี่ยนแปลงประเภทข้อมูลในเวลาเดียวกัน
Table.TransformColumnTypes เปลี่ยน Data Type ของคอลัมน์ที่ระบุให้เป็นประเภทใหม่ (เช่น Text เป็น Number, Date เป็น Text) โดยใช้ built-in conversion methods เบื้องหลัง รองรับการแปลงหลายคอลัมน์พร้อมกัน และสามารถระบุ culture parameter เพื่อจัดการ locale-specific formatting สำหรับวันที่และตัวเลข เหมาะสำหรับขั้นตอนเตรียมข้อมูลก่อน Load เข้า Data Model เพื่อป้องกัน conversion errors และเพิ่มประสิทธิภาพ ใช้ร่วมกับ Table.TransformColumns, Number.From, Text.From และ Date.From เมื่อต้องการ custom transformation logic
Table.WithErrorContext เป็นฟังก์ชันภายใน Power Query ที่ใช้เพิ่มข้อมูล context ให้กับค่า เพื่อให้ error messages มีความชัดเจนมากขึ้นเวลา debug
Combiner.CombineTextByDelimiter คืนค่าเป็น 'ฟังก์ชัน' ที่ช่วยรวม List ของข้อความด้วยตัวคั่น (Delimiter) ที่กำหนด มักใช้เป็น argument ในฟังก์ชันอื่นๆ เช่น Table.CombineColumns
แปลงค่า DateTime เป็นข้อความ (Text) โดยสามารถกำหนดรูปแบบวันที่และเวลาตามต้องการได้
Function.InvokeAfter เรียกใช้ฟังก์ชันหลังจากรอเวลาที่กำหนด นำไปใช้ในการควบคุมความเร็วเรียกข้อมูล API หรือเพิ่มความล่าช้าระหว่างการประมวลผล
JoinKind.Type คือ enum ที่ระบุประเภทของการ Join (Inner, Outer, Anti, Semi) เมื่อรวมตารางข้อมูลสองตาราง ใช้กับ Table.Join เพื่อควบคุมว่าแถวไหนจะปรากฏในผลลัพธ์
List.Positions หารายการของตำแหน่งทั้งหมดของค่าที่ระบุในรายการ ใช้สำหรับการค้นหาและการกำหนดตำแหน่งข้อมูล
กลับด้านข้อความ (Reverse String)
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่