dax 筛选 包含某个字_DAX分享9:DAX中用变量来计算动态filter context中数值
文章寫起來真的也挺麻煩的。堅持堅持!加油加油!
本次分享的需求描述如下:
在Power BI中創建一個頁面,頁面顯示一個Table和兩個Slicer。其中Slicer的內容也列在Table里。Table里需要一個計算值,這個計算值要求對Table中的一個非Slicer里的字段做匯總計算。
轉換成顯示頁面如圖所示。
熟悉的Product數據表。
兩個Slicer分別是Brand和Color。同時Brand和Color還顯示在Table里面。計算的數值內容是統計不同的Manufacturer生產多少種Product,即針對且只針對Manufacturer做分組(group by)計算Product。當選擇不同的Brand和Color時,數值也要根據實際顯示的Product再計算對Manufacturer做匯總。
DAX分享9效果圖https://www.zhihu.com/video/1110165158554456064其實這種需求還是很常見的。不知道大家有沒有什么好的方法。目前來說我覺得最簡單的方法就是定義變量了。先把最簡單的方法說一下,然后再把如果不用變量會遇到的問題分享一下。
var test =
VAR manu = MAX('Product'[Manufacturer])
RETURN
COUNTROWS(
FILTER(ALLSELECTED('Product'),'Product'[Manufacturer] <= manu))
就這么定義一下就ok了。so easy!
下面我們聊一聊如果不用變量可能出現的問題。
不考慮變量的話,首先對于針對其中一個字段做group by分組計算的話,這樣改寫filter context的行為,我們首先可以想到的是用CALCULATE函數。因為只針對Manufacturer,所以想到用ALLEXCEPT函數可以得到如下數據值列:
count per manufacturer = CALCULATE(COUNT('Product'[Product Name]),ALLEXCEPT('Product','Product'[Manufacturer]) )
er,這樣做當然是不全面的。因為兩個在Table里但是也顯示在Slicer字段,如果選擇了不同的Slicer數據時,count per manufacturer數據值是不會發生變化的。
比如,選擇了Color的Azure,在Table里面顯示了14條Product Name的的數據,并且都是在一個Manufacturer下面,所以,數據字段我期望的顯示應該是14而不是132.
這個count per manufacturer就像是Manufacturer的屬性一樣了,第一次計算好了之后,就不會變化了。現在我們開始考慮怎么在數據表里面接受外來filter的影響。首先想到的函數是ALLSELECTED()。但是,ALLEXCEPT函數是不能內嵌ALLSELECTED函數的。ALLSELECTED可以考慮到外部的篩選,但是如何做group by分組計算呢?此路不通。然后我想到了萬能的CALCULATE+FILTER,FILTER里面可以有ALLSELECTED函數,但是后面的參數這么實現動態的Manufacturer的抓取呢?
如果看過我之前分享的HASONEVALUE的同學,會不會想到用這個HASONEVALUE呢?我通過HASONEVALUE去抓取Slicer是否被選擇,然后再分情況計算,就像之前DAX分享8里面的做法那樣呢?嘿嘿,挺不錯的吖~~不過,也不對。這里重點說一下!HASONEVALUE或者HASONEFILTER說,如果數據字段被篩選了,就是TRUE,沒有被篩選就是FALSE。什么要被篩選了呢?在Slicer里面選擇算是,在Table里面作為字段也算是~~~也就是說,對于這里的Brand和Color,HASONEVALUE的返回值永遠都是TRUE。是不是很酸爽很好玩。
er,如果按照SQL邏輯來說,我比較期望,讓我的查詢結果,先和Brand,Color做關聯,然后再去計算group by的分組計算。想法是好的,但在實現的時候,報表其實做的是一個over partition的開窗計算,先計算好結果,然后又成為了一個屬性。
好吧,現在你明白了吧。有的時候,比如動態查詢的時候,就是非變量不行的時候了。記住!敲黑板!針對動態的filter context的時候,首選變量表達式。so easy!
歡迎關注DAX Share!
總結
以上是生活随笔為你收集整理的dax 筛选 包含某个字_DAX分享9:DAX中用变量来计算动态filter context中数值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【LeetCode笔记】322. 零钱兑
- 下一篇: adam算法效果差原因_干货|快来get