常見(jiàn)的DAX函數(shù)
現(xiàn)在您已經(jīng)了解了DAX的基本原理以及如何處理錯(cuò)誤條件,接下來(lái)是對(duì)DAX最常用的函數(shù)和表達(dá)式的簡(jiǎn)要介紹。
在本章的其余部分,您將看到一些最常用的DAX函數(shù),您可能會(huì)在自己的數(shù)據(jù)模型中使用這些函數(shù)。
聚合函數(shù)
幾乎每個(gè)數(shù)據(jù)模型都需要對(duì)聚合數(shù)據(jù)進(jìn)行操作。DAX提供了一組函數(shù),這些函數(shù)聚合了表格中列的值,并返回單個(gè)值。我們稱(chēng)這組函數(shù)集合函數(shù)。例如,下面的度量值計(jì)算銷(xiāo)售表Sales amount列中所有數(shù)字的總和
Sales := SUM ( Sales[SalesAmount] )
這個(gè)表達(dá)式(SUM)如果在一個(gè)計(jì)算列中使用的話(huà),就會(huì)聚集該表的所有行,但如果使用在度量值中,則只適用于在透視表中使用切片器、行、列和過(guò)濾條件的行。
聚合函數(shù)(SUM, AVERAGE, MIN, MAX, STDEV, and VAR)只在數(shù)字和日期類(lèi)型上運(yùn)行。
注意
MIN和MAX還有另一個(gè)功能:如果使用兩個(gè)參數(shù),它們將返回兩個(gè)參數(shù)的最小值或最大值。因此,MIN(1、2)將返回1和MAX(1、2)返回2。這個(gè)功能在2015年引入,當(dāng)您需要計(jì)算復(fù)雜表達(dá)式的最小值或最大值時(shí),它非常有用,因?yàn)樗苊庠贗F語(yǔ)句中多次寫(xiě)入相同的表達(dá)式。
與Excel類(lèi)似,DAX為這些函數(shù)提供了一種可選的語(yǔ)法,以便在可以同時(shí)包含數(shù)字和非數(shù)字值的列上進(jìn)行計(jì)算,比如文本列。該語(yǔ)法只是將后綴A添加到函數(shù)名中,只是為了獲得與Excel相同的名稱(chēng)和行為。然而,這些函數(shù)只對(duì)包含TRUE/FALSE的列有用,因?yàn)門(mén)RUE被評(píng)為1和FALSE為0。文本列總是被認(rèn)為是0。因此,無(wú)論列的內(nèi)容是什么,如果您使用,例如,在文本列上的MAXA,您總是會(huì)得到0作為結(jié)果。此外,DAX在執(zhí)行聚合時(shí)從不考慮空的單元格。
即使這些函數(shù)可以在非數(shù)值列上使用,而且不會(huì)返回錯(cuò)誤,它們的結(jié)果也沒(méi)有用,因?yàn)闆](méi)有自動(dòng)轉(zhuǎn)換為文本列的數(shù)字。這些函數(shù)被命名為AVERAGEA,COUNTA,MINA,MAXA。
注意
盡管統(tǒng)計(jì)函數(shù)的名稱(chēng)相同,但在DAX和Excel中使用的方式不同,因?yàn)樵贒AX中,列有一個(gè)類(lèi)型,它的類(lèi)型決定了聚合函數(shù)的行為。Excel為每個(gè)單元處理不同的數(shù)據(jù)類(lèi)型,而DAX則為每一列處理單個(gè)數(shù)據(jù)類(lèi)型。DAX以表格形式處理數(shù)據(jù),為每一列提供定義統(tǒng)一的類(lèi)型,而Excel公式適用于異構(gòu)單元格值,沒(méi)有定義統(tǒng)一的類(lèi)型。如果Power Pivot中的一個(gè)列有一個(gè)數(shù)字?jǐn)?shù)據(jù)類(lèi)型,那么所有的值都只能是數(shù)字或空單元格。
如果一個(gè)列是文本類(lèi)型,那么這些函數(shù)的值總是為0(除了COUNTA),即使文本可以轉(zhuǎn)換成數(shù)字,而在Excel中,值被認(rèn)為是逐個(gè)單元上的數(shù)字。由于這些原因,這些DAX函數(shù)對(duì)文本列不是很有用
您以前學(xué)過(guò)的函數(shù)對(duì)于聚合函數(shù)值是很有用的。有時(shí),您對(duì)聚合值不感興趣,但只對(duì)計(jì)數(shù)感興趣。因此,DAX提供了一組函數(shù),這些函數(shù)對(duì)于計(jì)數(shù)行或值很有用。
COUNT只在數(shù)字列運(yùn)行
COUNTA可以在任意類(lèi)型列上運(yùn)行
COUNTBLANK返回一列中空單元格數(shù)量
COUNTROWS返回一個(gè)表中行的數(shù)量
DISTINCTCOUNT返回一列中不重復(fù)列的數(shù)量
COUNTA是以A為后綴函數(shù)組中唯一有趣的函數(shù),因?yàn)樗祷亓兄蟹强盏膯卧駭?shù)量,而且是在任何類(lèi)型的列上工作。如果你想計(jì)算一個(gè)包含空值的列中的所有值,你可以使用COUNTBLANK函數(shù)。最后,如果您想計(jì)算一個(gè)表的行數(shù),您可以使用COUNTROWS函數(shù)。請(qǐng)注意,COUNTROWS需要一張表作為參數(shù),而不是列
注意
對(duì)應(yīng)任意一張表中的列,counta(table[column])+countblank(table[column])總是等于countrows(table)
最后一個(gè)函數(shù) DISTINCTCOUNT,是一個(gè)非常有用的函數(shù),正如名稱(chēng)所暗示的那樣,統(tǒng)計(jì)參數(shù)列的不同值數(shù)量,DISTINCTCOUNT會(huì)統(tǒng)計(jì)BLANK(空值),并作為其中的一個(gè)可能值。
注意
在2012年的DAX版本中,DISTINCTCOUNT成為了一個(gè)函數(shù)。早期版本的DAX沒(méi)有包括DISTINCTCOUNT,為了計(jì)算一個(gè)列的不同值的數(shù)量,您必須使用COUNTROWS(DISTINCT(table[column]))。這兩種模式返回的結(jié)果是相同的,但是DISTINCTCOUNT只需要一個(gè)函數(shù)調(diào)用,更容易閱讀。
到目前為止,您所學(xué)習(xí)的所有聚合函數(shù)都是在列上工作的(除了COUNTROWS,它在表上工作)。因此,它們只能聚合來(lái)自單個(gè)列的值。有聚合函數(shù)可以聚合一個(gè)表達(dá)式,而不是單個(gè)列。這組函數(shù)非常有用,特別是當(dāng)您想要使用不同的相關(guān)表的列進(jìn)行計(jì)算時(shí)。例如,如果一個(gè)銷(xiāo)售表包含所有的銷(xiāo)售事務(wù),并且一個(gè)相關(guān)的產(chǎn)品表包含關(guān)于產(chǎn)品的所有信息,包括它的成本,您可以通過(guò)用這個(gè)表達(dá)式定義一個(gè)度量值來(lái)計(jì)算銷(xiāo)售事務(wù)的總內(nèi)部成本
Cost := SUMX ( Sales, Sales[Quantity] * RELATED ( Product[StandardCost] ) )
該方法計(jì)算銷(xiāo)售表中每一行的數(shù)量(來(lái)自銷(xiāo)售表)和銷(xiāo)售產(chǎn)品的標(biāo)準(zhǔn)成本(來(lái)自相關(guān)產(chǎn)品表)。最后,它返回所有這些計(jì)算值的總和。
所有的聚合函數(shù)用X后綴結(jié)尾的行為如下:他們?cè)诿總€(gè)表的行(第一個(gè)參數(shù))計(jì)算一個(gè)表達(dá)式(第二個(gè)參數(shù)),并返回一個(gè)結(jié)果,最后通過(guò)與這些聚合函數(shù) (SUM, MIN, MAX or COUNT)一致的行為,將這些結(jié)果進(jìn)行聚合計(jì)算。
在第4章中,您將進(jìn)一步了解這種行為,為了正確理解他們的行為,我們將需要引入計(jì)算上下文的概念。可用的x后綴函數(shù)是 SUMX、AVERAGEX、PRODUCTX、COUNTX、COUNTAX, CONCATENATEX, MINX, and MAXX
還有一些迭代器沒(méi)有X后綴,比如FILTER和ADDCOLUMNS。所有這些都將在后面詳細(xì)解釋。
邏輯函數(shù)
有時(shí)您想要在表達(dá)式中構(gòu)建邏輯條件——例如,根據(jù)列的值或截獲錯(cuò)誤條件來(lái)實(shí)現(xiàn)不同的計(jì)算。在這些情況下,您可以使用DAX中的一個(gè)邏輯函數(shù)。您已經(jīng)在上一節(jié)中了解到,“處理DAX表達(dá)式中的錯(cuò)誤”,IF和IFERROR是該組函數(shù)中的兩個(gè)最重要的函數(shù)。
邏輯函數(shù)非常簡(jiǎn)單,按照它們的名字所暗示的,它們是 AND, FALSE, IF, IFERROR, NOT, TRUE, and OR。例如,如果你想要只有當(dāng)價(jià)格列包含正確的數(shù)字值時(shí),計(jì)算數(shù)量乘以?xún)r(jià)格,,你可以使用以下模式:
Amount = IFERROR ( Sales[Quantity] * Sales[Price], BLANK ( ) )
如果您沒(méi)有使用IFERROR,并且Price列包含一個(gè)無(wú)效的數(shù)字,那么計(jì)算列的結(jié)果將是一個(gè)錯(cuò)誤,因?yàn)槿绻恍挟a(chǎn)生計(jì)算錯(cuò)誤,錯(cuò)誤就會(huì)傳播到整個(gè)列。然而,IFERROR的使用會(huì)攔截錯(cuò)誤并使用空白值替換它。
這個(gè)類(lèi)別中的另一個(gè)有趣的函數(shù)是SWITCH,當(dāng)你有一個(gè)數(shù)量不多的不同值的列時(shí),你想要根據(jù)這個(gè)列值得到不同的行為,這是很有用的。例如,產(chǎn)品表中的列大小包含L、M、S、XL,您可能想要
將這個(gè)值解碼成一個(gè)更有意義的列,您可以通過(guò)使用嵌套的IF調(diào)用來(lái)獲得結(jié)果:
SizeDesc =
IF (
DProduct[Size] = "S",
"Small",
IF (
Product[Size] = "M",
"Medium",
IF (
Product[Size] = "L",
"Large",
IF ( Product[Size] = "XL", "Extra Large", "Other" )
)
)
)
使用SWITCH函數(shù)得到一種更方便的方式來(lái)表達(dá)相同的公式:
SizeDesc =
SWITCH (
Product[Size],
"S", "Small",
"M", "Medium",
"L", "Large",
"XL", "Extra Large",
"Other"
)
后一種表達(dá)式中的代碼可讀性更強(qiáng),即使速度不是更快,因?yàn)樵趦?nèi)部,DAX將SWITCH語(yǔ)句轉(zhuǎn)換為一組嵌套的IF函數(shù)。
小貼士
這里有一種有趣的方法,可以使用SWITCH函數(shù)來(lái)檢查同一個(gè)表達(dá)式中的多個(gè)條件。因?yàn)镾WITCH被轉(zhuǎn)換成一組嵌套的IF,第一個(gè)條件獲取匹配的勝出,您可以使用此模式測(cè)試多個(gè)條件:= SWITCH ( TRUE (), Product[Size] = "XL" && Product[Color] = "Red", "Red and XL", Product[Size] = "XL" && Product[Color] = "Blue", "Blue and XL", Product[Size] = "L" && Product[Color] = "Green", "Green and L" )在現(xiàn)實(shí)運(yùn)用中,使用TRUE作為第一個(gè)參數(shù),它的意思是說(shuō):“返回條件計(jì)算為真的第一個(gè)結(jié)果?!?/p>
信息函數(shù)
當(dāng)您需要分析表達(dá)式的類(lèi)型時(shí),您可以使用其中一個(gè)信息函數(shù)。所有這些函數(shù)都返回一個(gè) TRUE/FALSE,并且可以在任何邏輯表達(dá)式中使用。它們是 ISBLANK, ISERROR, ISLOGICAL, ISNONTEXT, ISNUMBER, and ISTEXT
需要重點(diǎn)注意的是,當(dāng)一個(gè)列(而不是表達(dá)式)作為參數(shù)傳遞時(shí),函數(shù)ISNUMBER、ISTEXT和ISNONTEXT總是返回TRUE或FALSE,這取決于列的數(shù)據(jù)類(lèi)型和每個(gè)單元的空值情況。
您可能想知道是否可以使用ISNUMBER與一個(gè)文本列來(lái)檢查是否有可能轉(zhuǎn)換成數(shù)字。不幸的是,您不能使用這種方法;如果您想要測(cè)試文本值是否可轉(zhuǎn)換為數(shù)字,您必須嘗試轉(zhuǎn)換,并在轉(zhuǎn)換失敗時(shí)處理錯(cuò)誤。例如,為了測(cè)試列價(jià)格(即類(lèi)型文本)是否包含有效數(shù)字,您必須編寫(xiě)
IsPriceCorrect = NOT ( ISERROR ( Sales[Price] + 0 ) )
DAX試圖在價(jià)格中加入數(shù)值零,以迫使從文本值轉(zhuǎn)換為數(shù)字;如果它成功了,那么它就會(huì)返回TRUE(因?yàn)镮SERROR會(huì)返回FALSE),否則它會(huì)返回FALSE(因?yàn)镮SERROR返回TRUE)。某些情況下轉(zhuǎn)換將會(huì)失敗,例如,對(duì)于某些行,價(jià)格有一個(gè)“n/a”字符串值。
但是,如果您嘗試使用ISNUMBER,就像在下面的表達(dá)式中一樣,您總是會(huì)得到錯(cuò)誤的結(jié)果:
IsPriceCorrect = ISNUMBER ( Sales[Price] )
在這種情況下,ISNUMBER總是返回FALSE,因?yàn)楦鶕?jù)元數(shù)據(jù),Price列不是一個(gè)數(shù)字,而是一個(gè)字符串,不管每一行的內(nèi)容是什么。
數(shù)學(xué)函數(shù)
在DAX中可用的數(shù)學(xué)函數(shù)集非常類(lèi)似于Excel中的同一套,具有相同的語(yǔ)法和行為。常用的數(shù)學(xué)函數(shù)是 ABS, EXP, FACT, LN, LOG, LOG10, MOD, PI, POWER, QUOTIENT, SIGN, and SQRT。隨機(jī)函數(shù)是 RAND和RANDBETWEEN。EVEN 和ODD 讓你測(cè)試數(shù)字。GCD和LCM對(duì)于計(jì)算兩個(gè)數(shù)字的最大公分母和最小公倍數(shù)是很有用的。QUOTIENT返回除法結(jié)果的整數(shù)部分。
最后,還有幾個(gè)舍入函數(shù)值得舉例;事實(shí)上,您可能使用幾種方法來(lái)獲得相同的結(jié)果??紤]這些計(jì)算列,以及它們?cè)趫D2-3中的結(jié)果:
FLOOR = FLOOR ( Tests[Value], 0.01 )
TRUNC = TRUNC ( Tests[Value], 2 )
ROUNDDOWN = ROUNDDOWN ( Tests[Value], 2 )
MROUND = MROUND ( Tests[Value], 0.01 )
ROUND = ROUND ( Tests[Value], 2 )
CEILING = CEILING ( Tests[Value], 0.01 )
ISO.CEILING = ISO.CEILING ( Tests[Value], 0.01 )
ROUNDUP = ROUNDUP ( Tests[Value], 2 )
INT = INT ( Tests[Value] )
FIXED = FIXED ( Tests[Value], 2, TRUE )

正如你所看到的,除了指定的數(shù)字的數(shù)量方式外,F(xiàn)LOOR, TRUNC和ROUNDDOWN 都是非常相似的。相反,CEILING和 ROUNDUP在它們的結(jié)果中非常相似。你可以看到在MROUND和 ROUND之間的舍入的方法有一些不同
三角函數(shù)
DAX提供了一組豐富的三角函數(shù),這些函數(shù)對(duì)于某些計(jì)算是有用的。我們不詳細(xì)討論這些函數(shù)的細(xì)節(jié),如果需要的話(huà),它們的用法很簡(jiǎn)單。它們是COS、COSH、COT、COTH、SIN、SINH、TAN和TANH,還有加arc前綴的版本( arcsin,arccos,等等)
文本函數(shù)
在DAX中,幾乎所有的文本功能都與Excel中可用的功能類(lèi)似,只有少數(shù)例外:它們是CONCATENATE, EXACT, FIND, FIXED, FORMAT, LEFT, LEN, LOWER, MID, REPLACE, REPT, RIGHT, SEARCH, SUBSTITUTE, TRIM, UPPER, and VALUE。這些函數(shù)對(duì)于操縱文本和從包含多個(gè)值的字符串中提取數(shù)據(jù)非常有用。例如,在圖2-4中,您可以看到一個(gè)從字符串中提取的姓和名的例子,其中包含了用逗號(hào)分隔的值,中間的標(biāo)題是我們想要?jiǎng)h除的

我們開(kāi)始計(jì)算兩個(gè)逗號(hào)的位置然后我們用這些數(shù)字來(lái)提取文本的右邊部分。SimpleConversion列實(shí)現(xiàn)了一個(gè)公式,它可能會(huì)返回錯(cuò)誤值如果字符串中有少于兩個(gè)逗號(hào)(如果沒(méi)有逗號(hào)會(huì)返回一個(gè)錯(cuò)誤),而FirstLastName列實(shí)現(xiàn)一個(gè)更復(fù)雜的表達(dá)式,在當(dāng)列中沒(méi)有逗號(hào)時(shí)不會(huì)返回錯(cuò)誤。
Comma1 = IFERROR ( FIND ( ",", People[Name] ), BLANK ( ) )
Comma2 = IFERROR ( FIND ( ",", People[Name], People[Comma1] + 1 ), BLANK ( ) )
SimpleConversion =
MID ( People[Name], People[Comma2] + 1, LEN ( People[Name] ) )
& " "
& LEFT ( People[Name], People[Comma1] - 1 )
FirstLastName =
TRIM (
MID (
People[Name],
IF ( ISNUMBER ( People[Comma2] ), People[Comma2], People[Comma1] ) + 1,
LEN ( People[Name] )
)
)
& IF (
ISNUMBER ( People[Comma1] ),
" "
& LEFT ( People[Name], People[Comma1] - 1 ),
""
)
正如您所看到的,F(xiàn)irstLastName列是由長(zhǎng)DAX表達(dá)式定義的,但是您必須使用它來(lái)避免可能出現(xiàn)的錯(cuò)誤,因?yàn)槿绻麊蝹€(gè)值產(chǎn)生錯(cuò)誤,則會(huì)傳播到整個(gè)列。
轉(zhuǎn)換函數(shù)
您在此之前已經(jīng)了解到,DAX執(zhí)行數(shù)據(jù)類(lèi)型的自動(dòng)轉(zhuǎn)換,調(diào)整它們以滿(mǎn)足運(yùn)算的需要。即使它是自動(dòng)發(fā)生的,一組函數(shù)仍然可以執(zhí)行顯式的類(lèi)型轉(zhuǎn)換
CURRENCY可以將表達(dá)式轉(zhuǎn)變?yōu)樨泿蓬?lèi)型,而INT則將表達(dá)式轉(zhuǎn)換為整數(shù)。 DATE 和TIME將日期和時(shí)間作為參數(shù),并返回一個(gè)正確的 DATETIME。VALUE把字符串轉(zhuǎn)換成數(shù)字格式,而格式則作為第一個(gè)參數(shù)和字符串格式獲得一個(gè)數(shù)字值,并可以將數(shù)值轉(zhuǎn)換成字符串。格式通常與DateTime一起使用。例如,下面的表達(dá)式返回“2015年1月12日”。
= FORMAT ( DATE ( 2015, 01, 12 ), "yyyy mmm dd" )
相反的操作,即將字符串轉(zhuǎn)換成DateTime值,是通過(guò)使用DATEVALUE函數(shù)來(lái)執(zhí)行的。
日期和時(shí)間函數(shù)
幾乎在每一種類(lèi)型的數(shù)據(jù)分析中,處理時(shí)間和日期都是工作的重要部分。DAX有大量的函數(shù)可以操作日期和時(shí)間。其中一些與Excel中的類(lèi)似功能相對(duì)應(yīng),并能對(duì)DateTime數(shù)據(jù)類(lèi)型進(jìn)行簡(jiǎn)單的轉(zhuǎn)換。
日期和時(shí)間函數(shù)分別是DATE, DATEVALUE, DAY, EDATE, EOMONTH, HOUR, MINUTE, MONTH, NOW, SECOND, TIME, TIMEVALUE, TODAY, WEEKDAY, WEEKNUM, YEAR, and YEARFRAC
為了能對(duì)日期做更復(fù)雜的操作,比如比較每年的聚合值,或者計(jì)算年初至今的度量值,還有另一組叫做時(shí)間智能函數(shù)的函數(shù),將在第7章“時(shí)間智能計(jì)算”中描述。
正如在本章中提到的,DateTime數(shù)據(jù)類(lèi)型在內(nèi)部使用一個(gè)浮點(diǎn)數(shù),其中整數(shù)部分對(duì)應(yīng)于1899年12月30日之后的天數(shù),而小數(shù)部分表示一天時(shí)間的分?jǐn)?shù)。小時(shí)、分鐘和秒被轉(zhuǎn)換成十進(jìn)制小數(shù)。因此,將整數(shù)值添加到DateTime值中,就會(huì)相應(yīng)地增加相應(yīng)天數(shù)的值。但是,您可能會(huì)發(fā)現(xiàn)使用轉(zhuǎn)換函數(shù)從日期中提取日、月和年更方便。在圖2-5中,您可以看到如何從包含日期列表的表格中提取這些信息:
Day = DAY ( Calendar[Date] )
Month = FORMAT ( Calendar[Date], "mmmm" )
Year = YEAR ( Calendar[Date] )

關(guān)系函數(shù)
兩個(gè)有用的函數(shù)可以讓你在DAX公式中操作關(guān)系,這兩個(gè)函數(shù)是RELATED的和RELATEDTABLE
您已經(jīng)知道,一個(gè)計(jì)算列可以引用定義它的表的列值。因此,在銷(xiāo)售中定義的計(jì)算列可以引用同一表格中的任意一列。但是,如果您必須引用另一個(gè)表中的列,您該怎么做呢?一般來(lái)說(shuō),除非在兩個(gè)表之間的模型中定義了關(guān)系,否則不能在其他表中使用列。如果這兩個(gè)表共享一段關(guān)系,那么 RELATED函數(shù)使您能夠訪問(wèn)相關(guān)表中的列
例如,您可能想要在銷(xiāo)售表中計(jì)算一個(gè)計(jì)算列,以檢查已售出的產(chǎn)品是否在“移動(dòng)電話(huà)”類(lèi)別中。要計(jì)算這樣一個(gè)列,您必須使用一個(gè)檢查產(chǎn)品類(lèi)別的值的條件,而這不是在銷(xiāo)售表中。盡管如此,一系列的關(guān)系從銷(xiāo)售開(kāi)始,通過(guò)產(chǎn)品和產(chǎn)品子類(lèi)傳遞到產(chǎn)品類(lèi)別,如圖2-6所示。

從原來(lái)的表到相關(guān)的表需要多少步這其實(shí)并不重要,因?yàn)镈AX將遵循完整的關(guān)系鏈并返回相關(guān)的列值。因此, AdjustedCost 列的公式可以是
Sales[AdjustedCost] =
IF (
RELATED ( 'Product Category'[Category] ) = "Cell Phone",
Sales[UnitCost] * 0.95,
Sales[UnitCost]
)
在一對(duì)多關(guān)系中,RELATED可以從多方訪問(wèn)一方,因?yàn)樵谶@種情況下,如果有的話(huà),相關(guān)表中只有一行存在。如果沒(méi)有這樣的行,RELATED只是返回BLANK
如果你在這段關(guān)系的一方,你想要訪問(wèn)多方,那么RELATED就沒(méi)有幫助了,因?yàn)榱硪贿叺脑S多行可能都適用于一行。在這種情況下,您可以使用RELATEDTABLE。RELATEDTABLE返回一個(gè)表格,其中包含與當(dāng)前行相關(guān)的所有行。例如,如果你想知道每個(gè)類(lèi)別中有多少產(chǎn)品,你可以用這個(gè)公式在產(chǎn)品類(lèi)別中創(chuàng)建一個(gè)列
= COUNTROWS ( RELATEDTABLE ( Product ) )
這個(gè)計(jì)算列將顯示,對(duì)于每個(gè)產(chǎn)品類(lèi)別,相關(guān)產(chǎn)品的數(shù)量,如圖2-7所示。

與RELATED的情況一樣,RELATEDTABLE可以遵循一系列的關(guān)系,并且總是從一方開(kāi)始,沿著多方的方向前進(jìn)。