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