CALCULATE 庖丁解牛系列- 擴展表 (4)

篩選與擴展表

(來自官方簡體筆記)

? ? DAX里的篩選表

? ? ? 本文介紹了一些可用于在DAX中篩選表的技術(shù)厚掷, 顯示了在你了解它們后可以避免的可能的錯誤行為及缺陷彭羹, 特別是當使用雙向篩選器時尖淘。

? ? ? ? 在學(xué)習(xí) DAX 時, 最難做的事情之一就是需要擺脫常識性的推理麻诀, 學(xué)習(xí)遵循一組新的規(guī)則: 它們是在邏輯語境中定義的献酗、并且有些獨特的思維。如果你之前有一定的編程或查詢基礎(chǔ)偎窘, 你將傾向于將以前的知識映射到 DAX乌助, 而忘記遵循使用該語言的基本規(guī)則的簡單思維路徑。

? ? ? 在開始時陌知,我想舉幾個例來充當思維陷阱(坑)他托。所有這些示例都是如何篩選表的基本變體。這些計算的數(shù)字本身沒有意義仆葡。我們的目標就是用它們理解這個理論赏参。把它映射到真實的例子是留給讀者的一個有趣的練習(xí)。
? ? ? 讓我們從以下代碼開始沿盅,它返回所有行的相同值:

DEFINE
MEASURE Sales[Test]=
CALCULATE (SUM ( Sales[Quantity])把篓,
ALL( 'Product' ) )
EVALUATE
ADDCOLUMNS ( VALUES ( 'Product'[Color] ), "Test"嗡呼,[Test] )

其結(jié)果是:

按此模式再舉一例:

接著解釋前面的公式返回所有行的相同值的原因是:

? ? ? ADDCOLUMNS在Product[Color]列上創(chuàng)建了一個行篩選纸俭,但是該度量包含了ALL ( 'Product' ),它消除了由篩選轉(zhuǎn)換生成的篩選器的影響南窗。通過在Sales-銷售表(事實表)上揍很,而不是產(chǎn)品表上執(zhí)行ALL()操作,你可以獲得類似的效果万伤。事實上窒悔,如果你定義以下度量:

DEFINE
MEASURE Sales[Test] =
CALCULATE(SUM( Sales[Quantity] ),
ALL( 'Product'[ProductKey] ))
EVALUATE
ADDCOLUMNS( VALUES ( 'Product'[Color] )敌买,
"Test"简珠,[Test] )


? ? ? 結(jié)果是:同樣的值重復(fù)出現(xiàn)在所有行中。雖然這是需要的正確值, 但很多人并不真正能理解為什么會發(fā)生這種情況聋庵。事實上膘融, 在考慮如何在 DAX 中使用Product[Color]列篩選Sales-銷售表時,這是一個普遍的想法:

? ? (1)ADDCOLUMNS 通過 " Color" 列篩選Product表祭玉。
? ? (2)Product[Color]上的篩選器依據(jù)Product [ProductKey] 列的一組值提供篩選氧映。

? ? ? 上述Product[ProductKey]列的子集將成為Sales [ProductKey]上的篩選器, 并將此篩選應(yīng)用于Sales-銷售表脱货, 結(jié)果只對給定的Color-顏色進行銷售計算岛都。換句話說,Product[Color]上的篩選器將成為Sales[ProductKey] 的篩選器振峻。不幸的是臼疫,這是不正確的。如果后者是真的扣孟, 則下面的代碼將返回所有行的相同值烫堤, 而實際上每一行都返回了不同的值:

DEFINE
MEASURE Sales[Test] =
CALCULATE(SUM( Sales[Quantity] ),ALL( Sales[ProductKey] ) )
EVALUATE
ADDCOLUMNS(VALUES( 'Product'[Color] )哈打,
"Test"塔逃,[Test] )

? 結(jié)果為:

? ? ? 這里,通過使用? ALL( Sales[ProductKey] )料仗,你清除了Sales[ProductKey]列上的任何篩選器湾盗,但是color-顏色列的篩選器仍然有效。這種行為的原因非常簡單:篩選器從來沒有被放在Sales[ProductKey]列上立轧,該篩選器只針對Product [Color]列格粪。
? ? ? 如果你認為—就像你在關(guān)系數(shù)據(jù)庫中所做的那樣:篩選器通過把兩個表連接在一起來工作,那么氛改,你就錯了帐萎。進一步的測試,如果你仍然不相信我胜卤,你可以再嘗試以下的DAX

DEFINE
MEASURE Sales[Test] =
CALCULATE(
SUM ( Sales[Quantity] )疆导, ALL( 'Product'[ProductKey]) )

EVALUATE
ADDCOLUMNS ( VALUES ( 'Product'[Color] ),
"Test"葛躏,[Test] )

? ? ? 同樣澈段,結(jié)果對于每一行都有不同的值。即使你從Product[ProductKey]中移除篩選器舰攒,Product[Color]列的篩選器仍然保持不變败富。關(guān)鍵是:這種行為與篩選的工作方式?jīng)]有任何聯(lián)系。篩選器只能通過使用擴展表來定義(在本系列的其他文章里摩窃,你了解更多關(guān)于擴展表的知識)兽叮。

? ? ? 擴展版的Sales表包含Product列。因此,當篩選Product[Color]時鹦聪,它將同時篩選Sales表账阻,而無需考慮關(guān)系、字段鍵或任何其他“關(guān)系”工具泽本。因為擴展模型(Sales表)包含Product[Color]列宰僧,所以,可以通過篩選Product[Color]來篩選Sales銷售表观挎。
? ? ? ? 那么,為什么這個方法可以去掉篩選器呢?

DEFINE
MEASURE Sales[Test] =
CALCULATE(
SUM ( Sales[Quantity] )段化,ALL ( Sales ))

EVALUATE
ADDCOLUMNS ( VALUES ( 'Product'[Color] )嘁捷,
"Test",[Test] )

? ? ? 原因是显熏, 此代碼清除了Product[Color]上的篩選器雄嚣。因為ALL ( Sales ) 刪除了擴展Sales表中的任何列上的任何篩選器。請記状 :

? ? ? 在 DAX 中缓升, 當你引用一個篩選器參數(shù)中的表時,這樣的表總是被擴展蕴轨。

? ? ? ? 因此港谊,ALL( Sales ) 參數(shù)不僅從Sales的任何原列表中移除篩選器(正如我們所看到的那樣,在這種情況下不會產(chǎn)生任何效果)橙弱,但它也從Sales的關(guān)系列中移除篩選器歧寺,其中當然也包括Product[Color]。
? ? ? ? 如果你還需要說服自己棘脐,你可以使用Sales表的所有列斜筐, 這時會注意到Product[Color]上的篩選器仍然在那里。刪除它的唯一方法是:

? ? ? ? 篩選Product表或使用擴展的Sales表蛀缝。

? ? ? ? 當激活A(yù)nalysisServices 2016或PowerBI 中的雙向篩選時顷链, 該方案變得更加復(fù)雜。事實上屈梁,雙向篩選并不適用于表的擴展嗤练。相反,雙向篩選是通過在執(zhí)行查詢時以顯式方式加入事實表篩選器來執(zhí)行的俘闯。這就造成了在使用該篩選器時需要額外的注意潭苞。

? ? 雙向篩選與擴展表

? ? ? 請考慮以下模型,通過使用中間維度表(Accounts)和(AccountCustomer)橋接表將客戶鏈接到Transactions-交易記錄表真朗。為了使該多到多的關(guān)系工作此疹,我們啟用了AccountCustomer橋接表和Account表之間的雙向篩選關(guān)系。

? ? ? 一個簡單的報告,顯示生成CustomerName的金額總和蝗碎,遍歷到多到多的關(guān)系湖笨, 并生成一個類似以下的正確結(jié)果:

? ? ? ? 有必要回顧一下這里所發(fā)生的事情。
? ? ? ? Customer客戶正在篩選bridge橋表蹦骑, 而橋接表則通過雙向關(guān)系篩選到Account帳戶表慈省。作為最后一步, Account表將篩選事務(wù)記錄表--Transactions眠菇。讓我們更準確地說說擴展表的幾個方面:
? ? ? (1)AccountCustomer 擴展到Customer表边败。因此, Customer表上的篩選器也會篩選橋表bridge捎废。

? ? ? (2)Transactions事務(wù)表擴展到Account笑窜,因此, Account表上的篩選也會對事務(wù)進行篩選登疗。
? ? ? (3)AccountCustomer表擴展到Account表排截, 但為了激活這種篩選,我們需要在計算中使用 AccountCustomer表作為一個篩選器參數(shù)辐益。使用雙向篩選器獲得了這種效果断傲。

? ? ? 在這里, 重要的部分是了解這個篩選器不是通過擴展表來移動的智政,而是通過加入篩選器實現(xiàn)的认罩。你可以通過使用"橋接表" 的老方法將篩選器從多端移動到一端來獲得類似的行為, 如下面的代碼所示:

CALCULATE( [SumOfAmount]续捂,AcccountCustomer )
其中猜年,SumOfAmount(元度量)的簡單定義為:
SumOfAmount:=SUM(Transactions[Amount] )

? ? ? 為什么說到篩選器,它們是相關(guān)連的疾忍?因為在這種情況下: 雙向篩選器引入的篩選器不能簡單地使用事實數(shù)據(jù)表中的ALL()來刪除乔外。
? ? ? 實際上,如果你編寫了一個新的度量值一罩, 用于從事務(wù)表中移除篩選器杨幼, 從而包含其擴展表 (包括Accounts帳戶), 則結(jié)果不是所期望的聂渊。請考慮以下公式:

SumOfAllAmount =
CALCULATE( [SumOfAmount]差购,ALL( Transactions ) )

? ? ? 它產(chǎn)生的結(jié)果與所之前度量的結(jié)果完全相同:

? ? ? 這里,從Transactions交易記錄表和Account帳戶表中正確地刪除了篩選器 (Account包含在擴展表的交易記錄中)汉嗽。但是欲逃, 橋接表上的篩選器是通過在擴展表之外工作的機制,這里是在Accounts表上運行的饼暑。因此稳析, 要從事實數(shù)據(jù)表中刪除該篩選器洗做, 當它來自bridge橋接表維度時, 也需要從 bridge 表中刪除該篩選器彰居。

? ? ? 實際上诚纸,下面的代碼會執(zhí)行正確刪除篩選器:

SumOfAllAmount :=
CALCULATE (
[SumOfAmount],ALL( AccountCustomer ) )

下圖顯示了該公式的正確結(jié)果(總是一個絕對值):

? ? ? 不需要從事實數(shù)據(jù)表或維度表中刪除篩選器陈惰, 因為它們的篩選器確實來自于橋表 (實際上畦徘,從Account表直接和橋表間接地連接方式)。在本例中抬闯, 從Account表或事務(wù)表中移除篩選器井辆, 證明是無用的。
? ? ? 正如你所看到的溶握,乍一看掘剪, 這與 DAX 處理篩選器似乎不一致, 但這只有當你不考慮擴展表的情況下是正確的奈虾。整個 DAX 關(guān)系模型是基于擴展表的, 當你掌握了以上概念后廉赔, 一切突然變得更有意義了肉微。


未完待續(xù)


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蜡塌,隨后出現(xiàn)的幾起案子碉纳,更是在濱河造成了極大的恐慌,老刑警劉巖馏艾,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劳曹,死亡現(xiàn)場離奇詭異,居然都是意外死亡琅摩,警方通過查閱死者的電腦和手機铁孵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來房资,“玉大人蜕劝,你說我怎么就攤上這事『湟欤” “怎么了岖沛?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長搭独。 經(jīng)常有香客問我婴削,道長,這世上最難降的妖魔是什么牙肝? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任唉俗,我火速辦了婚禮嗤朴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘互躬。我一直安慰自己播赁,他們只是感情好,可當我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布吼渡。 她就那樣靜靜地躺著容为,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寺酪。 梳的紋絲不亂的頭發(fā)上坎背,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天,我揣著相機與錄音寄雀,去河邊找鬼得滤。 笑死,一個胖子當著我的面吹牛盒犹,可吹牛的內(nèi)容都是我干的懂更。 我是一名探鬼主播,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼急膀,長吁一口氣:“原來是場噩夢啊……” “哼沮协!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起卓嫂,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤慷暂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后晨雳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體行瑞,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年餐禁,在試婚紗的時候發(fā)現(xiàn)自己被綠了血久。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡帮非,死狀恐怖洋魂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情喜鼓,我是刑警寧澤副砍,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站庄岖,受9級特大地震影響豁翎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜隅忿,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一心剥、第九天 我趴在偏房一處隱蔽的房頂上張望邦尊。 院中可真熱鬧,春花似錦优烧、人聲如沸蝉揍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽又沾。三九已至,卻和暖如春熙卡,著一層夾襖步出監(jiān)牢的瞬間杖刷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工驳癌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留滑燃,地道東北人。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓颓鲜,卻偏偏與公主長得像表窘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子甜滨,可洞房花燭夜當晚...
    茶點故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內(nèi)容