USERELATIONSHIP ช่วยให้คุณใช้ relationship ที่ไม่ใช่ active หรือเปลี่ยน relationship ที่ใช้ในการคำนวณ เหมาะสำหรับสถานการณ์เช่น sales data ที่มีหลาย date columns (OrderDate, ShippingDate, DeliveryDate)
=USERELATIONSHIP(<columnName1>, <columnName2>)
=USERELATIONSHIP(<columnName1>, <columnName2>)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| columnName1 | Column | Yes | คอลัมน์ที่เป็น foreign key (หลายรายการ) ของ relationship ที่ต้องการใช้ ต้องเป็นคอลัมน์จริง ไม่ใช่ expression | |
| columnName2 | Column | Yes | คอลัมน์ที่เป็น primary key (หนึ่งรายการ) ของ relationship ที่ต้องการใช้ ต้องเป็นคอลัมน์จริง ไม่ใช่ expression |
ถ้ามีวันที่ OrderDate เป็น Active Relationship แต่ต้องการดูยอดขายตาม DeliveryDate ชั่วคราว
ใช้ Date Table เดียวกันแต่มีหลายความสัมพันธ์กับ Fact Table เพื่อดูยอดขายตามวันที่สั่งซื้อ, วันที่จัดส่ง, วันที่ชำระเงิน พร้อมๆ กัน
Shipped Amount = CALCULATE( SUM(Sales[Amount]), USERELATIONSHIP(Sales[ShippingDate], 'Date'[Date]) )Shipped Amount =
CALCULATE(
SUM(Sales[Amount]),
USERELATIONSHIP(Sales[ShippingDate], 'Date'[Date])
)
ยอดขายตามวันที่ส่ง แทนวันที่สั่งซื้อ
Order vs Ship Variance = VAR OrderAmount = CALCULATE(SUM(Sales[Amount]), USERELATIONSHIP(Sales[OrderDate], 'Date'[Date])) VAR ShipAmount = CALCULATE(SUM(Sales[A…Order vs Ship Variance =
VAR OrderAmount =
CALCULATE(SUM(Sales[Amount]),
USERELATIONSHIP(Sales[OrderDate], 'Date'[Date]))
VAR ShipAmount =
CALCULATE(SUM(Sales[Amount]),
USERELATIONSHIP(Sales[ShippingDate], 'Date'[Date]))
RETURN
OrderAmount - ShipAmount
ความแตกต่างระหว่างยอดขายที่สั่งกับที่ส่งจริง
Current Month Orders = CALCULATE( SUM(Sales[Amount]), USERELATIONSHIP(Sales[OrderDate], 'Date'[Date]), 'Date'[MonthYear] = MAX('Date'[MonthYear]) ) All Time Ord…Current Month Orders =
CALCULATE(
SUM(Sales[Amount]),
USERELATIONSHIP(Sales[OrderDate], 'Date'[Date]),
'Date'[MonthYear] = MAX('Date'[MonthYear])
)
All Time Orders =
CALCULATE(
SUM(Sales[Amount]),
USERELATIONSHIP(Sales[OrderDate], 'Date'[Date]),
ALL('Date')
)
สามารถเปรียบเทียบเดือนปัจจุบันกับสะสมทั้งหมด
Delivery Time = VAR DeliveryAmount = CALCULATE(SUM(Sales[Amount]), USERELATIONSHIP(Sales[DeliveryDate], 'Date'[Date])) VAR OrderAmount = CALCULATE(SUM(Sales[Amo…Delivery Time =
VAR DeliveryAmount =
CALCULATE(SUM(Sales[Amount]),
USERELATIONSHIP(Sales[DeliveryDate], 'Date'[Date]))
VAR OrderAmount =
CALCULATE(SUM(Sales[Amount]),
USERELATIONSHIP(Sales[OrderDate], 'Date'[Date]))
RETURN
IF(OrderAmount > 0,
DIVIDE(DeliveryAmount, OrderAmount, 0),
BLANK())
เปอร์เซ็นต์ของ delivery ต่อ order ในวันเดียวกัน
ใช้ได้ทั้งคู่ ไม่ว่า relationship จะ active หรือ inactive ก็ตาม เพราะ USERELATIONSHIP ระบุ relationship โดยอ้างอิงคอลัมน์ของมันเองตามคำจำกัดความของ relationship
ใช้ได้เฉพาะใน CALCULATE, CALCULATETABLE, และ time-intelligence functions เช่น TOTALMTD, TOTALYTD เนื่องจากฟังก์ชันเหล่านี้ยอมรับ filter predicates
USERELATIONSHIP ที่อยู่ใน CALCULATE ชั้นในสุด (innermost) จะมีลำดับความสำคัญมากกว่า ถ้าปะทะกัน USERELATIONSHIP ตัวชั้นในจะชนะ
ใช้ได้ แต่ 1-to-1 relationship ระหว่างตาราง A และ B จะ activate เฉพาะทิศทางเดียว ถ้าต้องการทั้งสองทิศทาง ต้องใช้ USERELATIONSHIP สองครั้ง
ใช่ ห้ามใช้กับ Row-Level Security (RLS) ที่กำหนดบน table ที่มี relationship ต้องการใช้ และสูงสุด 10 nested USERELATIONSHIP functions ต่อสูตร
USERELATIONSHIP เป็นฟังก์ชันที่ช่วยให้คุณ override relationship ที่ active อยู่และใช้ relationship อื่นแทน ซึ่งสำคัญมากเวลาตาราง Data Model มีหลาย relationship ระหว่างสองตารางเดียวกัน
ที่เจ๋งคือ USERELATIONSHIP ทำงานได้ทั้งกับ active และ inactive relationship ดังนั้นจึงไม่ต้องแก้ relationship ในตัวแบบเสมอไป ถ้าคุณมี Sales table ที่เชื่อมต่อ Date table ผ่าน OrderDate, ShippingDate, และ DeliveryDate ก็สามารถสร้าง measure สำหรับแต่ละวันได้โดยไม่ต้องแก้ model
ส่วนตัวผมคิดว่า USERELATIONSHIP ช่วยให้ Data Model ยืดหยุ่นมากขึ้น เพราะเราไม่จำเป็นต้องเปลี่ยน active relationship ทั้งหนึ่ง ซึ่งอาจส่งผลต่อ report อื่นๆ ได้