1. 程式人生 > >PowerBI開發 第十四篇:DAX 表示式(時間+過濾+關係)

PowerBI開發 第十四篇:DAX 表示式(時間+過濾+關係)

DAX表示式中包含時間關係(Time Intelligence)相關的函式,用於對日期維度進行累加、同比和環比等分析。PowerBI能夠建立關係,通過過濾器來對影響互動的上下文。

一,時間關係

DAX表示式有兩種方式計算累加和,TOTALxTD()是DATESxTD()的語法糖,使得PowerBI對累加和的計算更加簡單。

所有的時間關係函式都包含一個特殊的dates引數,該引數有三種形式:

  • 對date/time列的引用,格式是DateTable[Date_Column]
  • 表格表示式,返回日期/時間型別的單列表
  • 布林表示式,用於定義日期/時間值的單列表。

為了應用時間關係,按照時間對資料分析,最好單獨建立一個日期維度表,並和事實表建立 1 : N  的關聯,確保關係是活躍的。日期維度的粒度設定為Day,確保日期維度表包括所有的日期資料。

1,直接計算累加和

DAX中有三個函式直接用於計算累加和,TOTALMTD是按當前月計算累加和、TOTALQTD是按當前季度計算累加和、TOTALYTD是按當前年份計算累加和:

TOTALMTD(<expression>,<dates>[,<filter>]) 
TOTALQTD(<expression>,<dates>[,<filter>])  
TOTALYTD(<expression>,<dates>[,<filter>][,<year_end_date>])  

引數 expression是聚合標量值的表示式,dates是包含日期的欄位,filter是過濾器,返回的是布林值。

例如,計算當前的銷售額:

= TOTALMTD(SUM(InternetSales[SalesAmount]),DateTime[DateKey])  

2,返回xTD得所有日期

返回到當前的所有日期,引數dates是隻包含一個日期列的表格,函式從dates中取第一個日期作為基準:

DATESMTD(<dates>)  
DATESQTD(<dates>)  
DATESYTD(<dates> [,<year_end_date>]) 

DATESMTD()函式適用於日期維度,該日期維度必須具有連續的非重複日期,從指定資料的第一年的1月1日到去年12月31日,該函式返回一個單列表,該表由上下文中當前日期的月份的第一個月與上下文中的當前日期之間的日期組成。

=CALCULATE(SUM(InternetSales[SalesAmount]), DATESMTD(DateTime[DateKey]))  

3,計算同比(前一個年份的同期)

函式PARALLELPERIOD用於計算平行時期,平行日期是指在引數dates上向前或向後移動多個時間間隔(intervals),該函式返回一個包含平行日期的表,使用該函式可以用於計算同比:

PARALLELPERIOD(<dates>,<number_of_intervals>,<interval>)

引數註釋:

  • dates 指定當前的日期
  • interval 指定時間間隔,有效值是 year、quarter和month
  • number_of_intervals 指定向前或向後移動的時間間隔

此函式獲取由dates指定的列中的當前日期集,將第一個日期和最後一個日期移動指定的間隔數,然後返回兩個移位日期之間的所有連續日期。 如果間隔是月,季度或年的部分範圍,則結果中的任何部分月份也將填寫以完成整個間隔。

例如,向前回滾12個月,把DateTime[DateKey]中的最小日期和最大日期移動指定的間隔數,然後返回兩個移位日期之間的所有連續日期,計算這些日期對應的銷量(Sales_Amount)。

CALCULATE([Sales_Amount]*1.1,PARALLELPERIOD(DateTime[DateKey],-12,MONTH))

在該示例中,CALCULATE的第二個引數是一個表格。

另一個函式是SAMEPERIODLASTYEAR(),它是PARALLELPERIOD(DateTime[DateKey],-12,MONTH) 的包裝器:

SAMEPERIODLASTYEAR(<dates>)

4,計算環比(前一天/月/季/年)

函式 PREVIOUS+(DAY/MONTH/QUARTER/YEAR),是把指定的日期向前移動的函式,引數是一個包含日期的資料表,返回的是一個包含日期的資料表。

PREVIOUSDAY(<dates>)  
PREVIOUSMONTH(<dates>) 
PREVIOUSQUARTER(<dates>)
PREVIOUSYEAR(<dates>[,<year_end_date>])  

對於PREVIOUSMONTH()函式,該函式使用dates(輸入引數)中的第一個日期作為基準,返回該日期上個月的所有日期。 例如,如果dates引數中的第一個日期指的是2009年6月10日,則此函式將返回2009年5月的所有日期。

=CALCULATE(SUM(InternetSales[SalesAmount]), PREVIOUSMONTH(Date[DateKey]))  

二,過濾相關

過濾相關的函式,這些函式跟PowerBI上過濾器圖表(Slicer)。

1,過濾器選中的值(唯一值)

過濾器當前選中的值,可以通過函式來獲取:

SELECTEDVALUE(<columnName>[, <alternateResult>]) 

引數註釋:

  • columnName :是已存的一個列名,不能是表示式,當columnName的上下文僅被過濾為一個不同的值時,該函式返回該值;
  • alternateResult:可選項,預設值是BLANK();如果columnName的上下文被過濾到0個或多個唯一值時,返回alternateResult;

 當過濾器只被選中一個值時,該函式會返回選中的值。

2,過濾器選中的值(多值)

函式VALUES()返回一個單列的表,該列由引數ColumnName指定,該表包含該列的所有唯一值。

VALUES(<ColumnName>)  

該函式受到過濾器的影響,在已過濾的上下文中使用VALUES函式時,VALUES返回的唯一值會受到過濾器的影響。 例如,如果按Region過濾,並返回City的列表,則VALUES()函式僅包括過濾器允許的區域中的那些城市。

=COUNTROWS(VALUES(InternetSales[SalesOrderNumber]))  

Values函式和Distinct函式很相似,唯一不同的是Values函式會返回Unknown,這是因為關聯的Table中包含不匹配的資料行,和Left Join的右表中包含NULL值很相似。

結合CONCATENATEX函式,能夠把所有過濾器的唯一值連線成字串。注意,DAX表示式使用 & 進行字串的連線。

三,關係

表與表之間,可以建立多個關係,但是,只有一個關係是活躍的,該關係是預設的關係。預設情況下,度量表達式都會使用預設的關係應用過濾器,進行互動計算。

USERELATIONSHIP(<columnName1>,<columnName2>) 

USERELATIONSHIP使用模型中的現有關係,通過其端點列來標識關係,該函式用於指定要在特定計算中使用的關係。在USERELATIONSHIP中,關係的狀態並不重要,也就是說,關係是否處於活動狀態不會影響該功能的使用。 即使關係處於非活動狀態,它也將被使用並覆蓋模型中可能存在但在函式引數中未提及的任何其他活動關係。

USERELATIONSHIP 函式不返回任何值,僅在計算期間啟用指定的關係,並且僅用於把filter作為引數的函式中,例如,CALCULATE、CALCULATETABLE、CLOSINGBALANCEMONTH、CLOSINGBALANCEQUARTER、CLOSINGBALANCEYEAR、TOTALMTD, TOTALQTD 和 TOTALYTD。

參考文件: