CROSSJOIN สร้างตารางใหม่โดยการรวมแถวทั้งหมดจากตารางที่ระบุ โดยสร้างทุก Combination ที่เป็นไปได้ ผลลัพธ์คือตารางที่มีจำนวนแถวเท่ากับผลคูณของจำนวนแถวของแต่ละตาราง
| อาร์กิวเมนต์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
| table1 | Table | ตารางตัวแรกที่ต้องการนำมาสร้าง Combination นี่คือตารางใดก็ได้ที่ส่งกลับมาจากนิพจน์ DAX (เช่น VALUES, SUMMARIZE, DATATABLE เป็นต้น) | |
| table2 | Table | ตารางตัวที่สองที่ต้องการนำมาสร้างผลคูณคาร์ทีเซียน ชื่อคอลัมน์ต้องไม่ซ้ำกับตาราง table1 | |
| [table3]ไม่บังคับ | Table | ไม่มีตารางเพิ่มเติม | ตารางตัวที่สาม ห้า หรือมากกว่า (ทำซ้ำได้ตามต้องการ) สำหรับการสร้าง Combination ของตารางมากกว่า 2 ตาราง |
[ ] = อาร์กิวเมนต์ที่ไม่บังคับ
CROSSJOIN เป็นฟังก์ชันที่สร้าง ผลคูณคาร์ทีเซียน (Cartesian Product) ของแถวทั้งหมดจากสองตารางหรือมากกว่านั้น ผลลัพธ์คือตารางใหม่ที่มีทุก Combination ที่เป็นไปได้ของแถวจากตารางต้นฉบับ
เช่น ถ้า Table A มี 3 แถว และ Table B มี 4 แถว CROSSJOIN(Table A, Table B) จะได้ตารางใหม่ที่มี 3 x 4 = 12 แถว
จำนวนแถวผลลัพธ์ = (แถวของตาราง 1) × (แถวของตาราง 2) × (แถวของตาราง 3) …
จำนวนคอลัมน์ผลลัพธ์ = (คอลัมน์ของตาราง 1) + (คอลัมน์ของตาราง 2) + (คอลัมน์ของตาราง 3) …
เช่น ต้องการสร้างตารางทุก Combination ของ Product และ Scenario (Best/Worst Case) เพื่อวิเคราะห์ผลลัพธ์
สร้างตารางที่ใช้ในการทดสอบสูตรหรือโมเดลต่างๆ
ถ้ามี 10 สินค้า และ 5 ปี จะได้ตาราง 50 แถว แสดงทุก Combination ของสินค้าและปี นี่มีประโยชน์สำหรับการทำให้เห็นว่าสินค้าไหนที่ขายในปีไหนบ้าง และปีไหนที่ไม่มีการขาย
สร้างตารางที่เป็นไปได้ทั้งหมด (CROSSJOIN) แล้วลบด้วยตารางที่มีขายจริง (SUMMARIZE) เพื่อหาช่องว่าง เช่น ถ้ามี 5 ร้านค้า และ 8 สินค้า ควรจะมี 40 Combination แต่ถ้าขายจริงมีแค่ 35 แถว แสดงว่ามี 5 Combination ที่ไม่มีขายอยู่
รวม 4 ดอก x 13 แต้ม ได้ 52 ใบ ตัวอย่างนี้แสดงให้เห็นว่า CROSSJOIN ใช้สร้างชุดข้อมูล synthetic ที่ครอบคลุมทุก Combination ที่เป็นไปได้
4 ระดับราคา × 5 ระดับปริมาณ = 20 แถว ใช้ประโยชน์เมื่อต้องการวิเคราะห์สถานการณ์ที่เป็นไปได้ทั้งหมด (Scenario Analysis)
CROSSJOIN ไม่สนใจ Relationship หรือคอลัมน์ที่ตรงกัน มันจะสร้างทุก Combination ของแถวทั้งหมดโดยไม่คำนึงถึงค่าใดๆ ส่วน NATURAL…JOIN จะรวมตารางโดยอาศัยคอลัมน์ที่ชื่อตรงกัน และความสัมพันธ์ (Relationship) ของตารางในโมเดล
ควรหลีกเลี่ยงการใช้กับตารางขนาดใหญ่มากๆ เพราะจำนวนแถวจะเพิ่มขึ้นแบบทวีคูณ (เช่น ตาราง A มี 1 ล้านแถว, ตาราง B มี 1 ล้านแถว -> CROSSJOIN จะได้ 1 ล้านล้านแถว) ทำให้ Memory เต็มได้ง่ายและประสิทธิภาพลดลงอย่างมาก
CROSSJOIN จะส่งข้อผิดพลาด (Error) หากชื่อคอลัมน์ซ้ำกัน ต้องใช้ ADDCOLUMNS หรือ SELECT เพื่อเปลี่ยนชื่อคอลัมน์ก่อนใช้ CROSSJOIN
CROSSJOIN สร้างผลคูณโดยไม่มีเงื่อนไข ส่วน GENERATE สามารถสร้าง Combination ตามเงื่อนไข (เช่น ใช้ CALCULATE เพื่อกรอง) ทำให้ GENERATE มีประสิทธิภาพดีกว่าเมื่อต้องการเลือก Combination บางส่วน
ฟังก์ชันที่ผู้เขียนโยงไว้กับ CROSSJOIN จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
ADDCOLUMNS เป็นฟังก์ชัน table transformation ที่ใช้สำหรับเพิ่มคอลัมน์ใหม่ (Calculated Columns) เข้าไปในตารางที่มีอยู่เดิม โดยคำนวณค่าในแต่ละแถวผ่าน Row Context และส่งคืนตารางเดิมพร้อมคอลัมน์ใหม่ต่อท้าย
DATATABLE สร้างตารางแบบ hardcode ด้วยข้อมูลคงที่ โดยระบุชื่อคอลัมน์ ชนิดข้อมูล และค่าของแต่ละแถว เหมาะสำหรับตารางอ้างอิงเล็กๆ เช่น lookup table หรือข้อมูลตัวอย่าง
EXCEPT คืนตารางของแถวที่อยู่ใน LeftTable แต่ไม่อยู่ใน RightTable เหมาะกับการหาสิ่งที่ขาดหาย เช่น สินค้าที่ไม่เคยขาย ลูกค้าที่ไม่มีธุรกรรม
GENERATE วนทีละแถวใน Table1 แล้วประเมิน Table2 ในบริบทของแถวนั้น (row context) จากนั้นรวมผลทั้งหมดเป็นตารางเดียว ถ้า Table2 ว่างเปล่าในรอบไหน แถวนั้นจาก Table1 จะถูกตัดออก (ต่างจาก GENERATEALL)
GENERATEALL วนแถวของตาราง 1 แล้วสร้าง Cartesian product กับผลลัพธ์ของตาราง 2 โดยคงแถวที่ไม่มีข้อมูลย่อย ต่างจาก GENERATE ตรงที่ไม่ตัดแถวหลักออก
NATURALINNERJOIN ทำ inner join ระหว่าง LeftTable และ RightTable โดยใช้คอลัมน์ชื่อเดียวกันเป็นคีย์การจับคู่ คืนผลลัพธ์เฉพาะแถวที่จับคู่ได้ทั้งสองตาราง และมักใช้ร่วมกับ SELECTCOLUMNS เพื่อจัดชื่อคอลัมน์ให้ตรงกัน
NATURALLEFTOUTERJOIN ทำ left outer join ระหว่าง LeftTable และ RightTable โดยใช้คอลัมน์ชื่อเดียวกันเป็นคีย์ เก็บทุกแถวของตารางซ้ายไว้ทั้งหมด และเติมคอลัมน์จากตารางขวาเมื่อจับคู่ได้ (ไม่จับคู่จะเป็น BLANK)
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 ดีกว่าอย่างมาก
VALUES ดึงค่าที่ไม่ซ้ำจากคอลัมน์ หรือดึงแถวทั้งหมดจากตาราง โดยรวมแถว BLANK ที่เกิดจากข้อผิดพลาดของความสัมพันธ์ (Referential Integrity Violations) ส่วน DISTINCT จะไม่รวมแถว BLANK นี้
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 โดยตรงแทน
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่