ภาษา DAX (Data Analysis eXpression) เป็นภาษาที่ใช้ในการเขียนสูตรของ Power BI และ Power Pivot ซึ่งเป็นภาษาที่มีหน้าตาภายนอกคล้ายคลึงสูตรของ Excel มากๆ แต่เบื้องลึกนั้นอาจมีความต่างพอสมควร…
Concept การทำงานของ DAX นั้นจะผูกโยงกับ Data Model หรือโครงสร้างความสัมพันธ์ของข้อมูลในตาราง และขึ้นอยู่กับบริบทของการ Filter ข้อมูลเป็นอย่างมาก ดังนั้นคนที่ใช้ Excel มาก่อนจำชำนาญแล้ว ก็ยังจำเป็นต้องศึกษา DAX เพิ่มเติมอีกเยอะเลยกว่าจะใช้ได้ DAX ได้เก่ง
จากที่ผมได้เคยอ่านบทความ 10 ขั้นวิทยายุทธ Excel ที่พี่บิว “วิศวกรรีพอร์ต” ได้เขียนไว้นานแล้ว ผมคิดว่ามันทำให้คนอ่านเห็นภาพรวมได้ง่ายขึ้นว่าทักษะ Excel โดยรวมมีอะไร และทักษะตัวเราเองอยู่ประมาณขั้นไหน ผมก็เลยอยากเขียนบทความที่คล้ายๆ กัน แต่เป็นเรื่องของ DAX บ้าง
หวังว่าบทความนี้จะสามารถเป็นเหมือนแผนที่ให้เพื่อนๆ ได้เห็นภาพรวม และเข้าใจการเขียนรู้ DAX ได้มากขึ้นนะครับ ซึ่งแน่นอนว่าการแบ่งขั้นพวกนี้ ไม่ได้มีหลักเกณฑ์สากลอะไรมาแบ่งหรอกครับ แต่เป็นความคิดเห็นของผมที่ใช้ DAX มาเยอะพอสมควร จึงอยากลองเอาความรู้ที่มีมาลองแบ่งดูครับ
ถ้าพร้อมแล้วไปดูกันเลยว่ามีขั้นอะไรบ้าง? แล้วลองอ่านเล่นๆ ดูสิว่าตัวคุณเองน่าจะอยู่ขั้นไหนแล้ว ^^
ขั้นที่ 1 : รู้จักพื้นฐานของ DAX
- รู้จักประเภทข้อมูลใน DAX
- รู้ว่า =SUM(TableName[ColumnName]) ควรจะเขียนเป็น New Column หรือ New Measure
- รู้วิธีอ้างอิงคอลัมน์ (TableName[ColumnName]) อ้างอิงตาราง (TableName) อ้างอิง Measure ([MeasureName])
- สามารถใช้ฟังก์ชัน DAX ง่ายๆ เช่น SUM, IF, RELATED, DIVIDE, COUNTROWS, DISTINCTCOUNT ได้
ขั้นที่ 2 : เริ่มใช้ลูกเล่นใน DAX
- สามารถใช้เครื่องหมายพิเศษต่างๆ ในสูตรได้ เช่น เครื่องหมาย &&, ||, IN, NOT, { }
- รู้ว่า DAX แปลงประเภทข้อมูลให้เราแบบไหน เช่น เอา Text บวกกันได้อะไร?
- ใช้ SWITCH + TRUE เพื่อเขียนเงื่อนไขแทนการใช้ IF ซ้อน IF
- สามารถใช้ Iterator เช่น SUMX เพื่อหาผลรวมข้อมูล 2 คอลัมน์ที่คูณกันได้
- ใช้ VAR + RETURN เพื่อประกาศตัวแปรขึ้นมาเก็บการคำนวณในสูตรได้
- เขียน Comment ในสูตร ( ขึ้นต้นด้วย // ) เพื่ออธิบายการทำงานของสูตรได้
- สามารถสร้าง Date Table ขึ้นมาได้ด้วยตัวเองด้วย CALENDAR และเพิ่มคอลัมน์ได้ดั่งใจด้วย FORMAT ได้
ขั้นที่ 3 : สามารถใช้ฟังก์ชัน CALCULATE เบื้องต้นได้
- สามารถรู้ได้ว่า ณ จุดที่เราพิจารณาอยู่นั้น มีการ Filter อะไรอยู่บ้าง (Filter Context)
- สามารถใช้ CALCULATE Filter ข้อมูล 1 เงื่อนไขเทียบกับค่าคงที่ได้
- สามารถใช้ CALCULATE Filter ข้อมูล 2 เงื่อนไขแบบ AND ได้
- รู้ว่าการเขียนเงื่อนไขเปรียบเทียบใน CALCULATE จะปลด Filter เดิมก่อนทำการ Filter เงื่อนไขใหม่
- สามารถใช้ CALCULATE ปลด Filter ด้วย REMOVEFILTERS, ALL, ALLSELECTED, ALLEXCEPT ได้
ขั้นที่ 4 : จัดการเงื่อนไขเกี่ยวกับ Filter ที่ระดับต่างๆ ในรายงาน
- ใช้ฟังก์ชัน FILTER ควบคู่เงื่อนไข AND, OR ได้อย่างเหมาะสม
- รู้ว่า DAX สามารถมอง Table ที่มี 1 Row 1 Column ให้กลายเป็นค่า Scalar ได้
- ใช้ ISFILTERED, ISCROSSFILTERED, ISINSCOPE แบ่งแยก Level ของ Hierarchy ได้ (เช็คจากตัวย่อยไปใหญ่)
- ใช้ SELECTEDVALUE เพื่อดึงค่าที่ถูกเลือกจาก Slicer ได้
- ใช้ TOPN เพื่อคัดเลือกข้อมูลที่ต้องการได้
- ใช้ LOOKUPVALUE ดึงค่าที่ต้องการตามเงื่อนไขที่กำหนดได้
ขั้นที่ 5 : สามารถใช้ CALCULATE ที่ซับซ้อนขึ้นได้
- รู้ว่าจริงๆ แล้วเงื่อนไข Filter ของ CALCULATE คือ Table
- สามารถใช้ CALCULATE ควบคู่กับ Time Intelligence Function ได้
- ใช้ VAR ร่วมกับ CALCULATE เพื่อ Filter ข้อมูลเทียบกับ สูตรหรือ Measure ได้
- หลังปลด Filter แล้ว ใส่ Filter เข้าไปใหม่เฉพาะ Field ที่ต้องการด้วย VALUES ได้
- สามารถใช้ CALCULATE จัดการเส้น Relationship ด้วย USERELATIONSHIP/CROSSFILTER ได้
- รู้จัก Effect ของ Sort by Column ที่มีผลต่อการปลด Filter
- รู้จัก Effect ของ คอลัมน์ Date ใน Date Table ที่มีผลต่อการปลด Filter
ขั้นที่ 6 : ใช้ Context Transition กับ Iterator ให้เป็นประโยชน์ได้
- แยกความแตกต่างระหว่าง Row Context และ Filter Context ได้
- รู้ว่าการอ้าวอิง Measure ทุกครั้งมี CALCULATE แฝงอยู่ และสามารถเกิด Context Transition ได้
- เข้าใจความแตกต่างของ DISTINCT, VALUES และ ALL และใช้สร้างตารางจำลองใน Measure ได้
- สามารถใช้ Context Transition คู่กับ Iterator เช่น SUMX, MAXX, CONCATENATEX, RANKX ได้
- เข้าใจลำดับขั้นตอนในการคำนวณของ CALCULATE เวลามีหลายเงื่อนไขพร้อมกัน รวมถึงเวลาใช้ CALCULATE 2 ตัวซ้อนกัน
ขั้นที่ 7 : ใช้ Expanded Table ให้เป็น
- เข้าใจแนวคิดของ Expanded Table ว่ามันคือตารางหลัก + ดึงคอลัมน์ที่เกี่ยวข้องทั้งหมดจากตารางฝั่งที่เป็นเลข 1
- เข้าใจว่าจริงๆ แล้วการทำงานของ RELATED นั้นเป็นการเข้าถึง Column ใน Expanded Table
- รู้ว่าการอ้างอิง Table หมายถึง Expanded Table เสมอ
- เข้าใจความแตกต่างของ Column Filter และ Table Filter (Expanded Table) และเลือกใช้ให้ถูกต้อง
- สามารถใช้ Expanded Table เป็นเงื่อนไขของ CALCULATE ได้อย่างเหมาะสม
ขั้นที่ 8 : รู้จักสร้าง/จัดการตารางจำลอง
- สามารถสร้างคอลัมน์จำลองในตารางจำลองด้วย ADDCOLUMNS และเลือกคอลัมน์ด้วย SELECTCOLUMNS
- รู้ว่าสามารถอ้างอิงคอลัมน์ในตารางจำลองที่สร้างขึ้นใน VAR ด้วย [ColumnName] ได้
- เลือกใช้ CALCULATETABLE (มี Context Transition) แทน Filter ได้อย่างเหมาะสม
- ใช้ UNION, INTERSECT และ EXCEPT เพื่อสร้างตารางผลลัพธ์ใหม่ที่ต้องการ
- เข้าใจความแตกต่างของ SUMMARIZE , GROUPBY, CROSSJOIN, GENERATE, GENERATESERIES
- รู้จักแนวคิดของ Data Lineage
- สามารถใช้ TREATAS ใน CALCULATE เพื่อเลียนแบบ Relationship จากคอลัมน์อื่น / สร้าง Virtual Relationship ได้
- สามารถใช้ INTERSECT แทน TREATAS ได้กรณีที่ไม่มีให้ใช้ (เช่น ใน Excel)
ขั้นที่ 9 : เข้าใจ/สร้างสูตร DAX ที่ซับซ้อนได้
- เข้าใจ DAX Pattern ต่างๆ ใน DaxPatterns.com ได้
- สามารถสร้างสูตร DAX เพื่อตอบโจทย์ธุรกิจที่ต้องการได้ เช่น คำนวณสินค้าคงค้างเฉลี่ย, คำนวณต้นทุน FIFO, คำนวณยอดเงิน Balance ล่าสุดในบัญชี เป็นต้น
- จัดการปัญหาใน Data Model ที่มีความสัมพันธ์แบบ Many to Many ได้
- สามารถใช้ Calculation Group ได้
- เข้าใจการทำงานที่แท้จริงของ ALLSELECTED (เกี่ยวกับ Shadow Filter Context)
ขั้นที่ 10 : Optimize การทำงานของ DAX ให้เร็วขึ้น
- สามารถใช้ DAX Studio เพื่อสร้าง/ทดสอบ DAX Query ได้
- เข้าใจการทำงานของ DAX Engine ทั้งส่วนของ Formula Engine และ Storage Engine
- เข้าใจการทำงานของ Vertipaq Storage Engine
- ใช้ Vertipaq Analyzer เพื่อดูข้อมูลเกี่ยวกับสูตรต่างๆ และ Data Model ได้
- สามารถค้นหา DAX/MDX Query ที่เป็นตัวปัญหาที่ทำให้รายงานช้าได้
- สามารถตัดสินใจว่าเมื่อไหร่ควรจะสร้าง New Column ขึ้นมาจริงๆ เพื่อให้เกิด Performance ที่ดีที่สุด
- สามารถวิเคราะห์ DAX Query Plan และ Server Timing เพื่อหาตัว Bottlenecks หรือคอขวดได้
- เลือกใช้ฟังก์ชันและวิธีที่เหมาะสมในการแก้ปัญหาแทนวิธีการเดิมที่เชื่องช้าได้
คุณล่ะ คิดว่าตัวเองอยู่ประมาณขั้นไหน?
ถ้าจะให้ลองประเมินตัวเองเล่นๆ ตอนนี้ผมเองก็น่าจะอยู่ขั้น 8-9 เท่านั้นครับ (ยังไม่ถึง 10 แน่นอน) ดังนั้นเป็นไปได้ว่า อาจจะยังมีสิ่งที่ยากกว่าขั้นที่ 10 อีกแต่ผมยังไม่รู้ ดังนั้นหากใครที่มีความเชี่ยวชาญ DAX อยากจะเสนอแนะอะไรก็สามารถบอกได้เลยไม่ต้องเกรงใจนะครับ
ป.ล. 10 ขั้นที่เขียนนี้พูดแค่เรื่องในมิติของ DAX เท่านั้นนะครับ ซึ่งไม่ได้รวมถึงเรื่องสำคัญอื่นๆ ใน Power BI เช่น Power Query / Data Model / ส่วน Report Visualization นะครับ ซึ่งยังต้องเก่งเรื่องพวกนี้อีกถึงจะใช้ Power BI ได้เต็มที เฮ้อ…เหนื่อย! (แต่มันคุ้มนะ เพราะมันเจ๋งมากจริงๆ)
ส่วนตัวผมเองคิดว่าจะนำลำดับขั้นเหล่านี้ไปปรับปรุงคอร์ส Power BI ของผมให้ดียิ่งขึ้นด้วยครับ และน่าจะเป็นแนวทางที่ดีในการพัฒนาคอร์ส DAX Advance ในอนาคตด้วยครับ ^^