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。
參考文檔:
DAX Reference
DAX Time Intelligence Functions
PowerBI開發 第十四篇:DAX 表達式(時間+過濾+關系)