參考教程:
https://www.jianshu.com/p/723dc3988fea
https://zhuanlan.zhihu.com/p/88528732
一,累計開業至今
1歷史至今 累計收入 = CALCULATE( SUM('訂單表'[銷售額]), FILTER( ALL('日期表'), '日期表'[日期]<=MAX('日期表'[日期]))) //用MAX函數獲取當前上下文的日期;然后返回小於等於當前日期的所有銷售額的合計 2歷史至今 累計收入 優化 = IF( MIN('日期表'[日期])<=[訂單最大日期], CALCULATE( SUM('訂單表'[銷售額]), FILTER( ALL('日期表'), '日期表'[日期]<=MAX('日期表'[日期])))) //大於最后一個訂單日期的無須計算,因為結果並不會發生變化 3歷史至今 平均訂單銷售 = IF( MIN('日期表'[日期])<=[訂單最大日期], CALCULATE( AVERAGE('訂單表'[銷售額]), FILTER( ALL('日期表'), '日期表'[日期]<=MAX('日期表'[日期]))))
二,本期至今
#年度至今(YTD) [YTD Sales] := CALCULATE ( [Sales Amount], DATESYTD('Date'[Date] ) ) 以上表達式等價於: [YTD Sales]:=TOTALYTD([Sales Amount],'Date'[Date]) #季度至今(QTD) [QTD Sales] := CALCULATE ( [Sales Amount], DATESQTD('Date'[Date] ) ) 以上表達式等價於: [QTD Sales]:=TOTALQTD([Sales Amount],'Date'[Date]) #月度至今(MTD) [MTD Sales] := CALCULATE ( [Sales Amount], DATESMTD('Date'[Date] ) ) 以上表達式等價於: [MTD Sales]:=TOTALMTD([Sales Amount],'Date'[Date]) #本周至今(WTD) [WTD] = CALCULATE( [業務指標], FILTER( ALL('日期'), '日期'[Yearweek] = SELECTEDVALUE('日期'[yearweek]) && '日期'[Date] <= SELECTEDVALUE('日期'[date]) ))
三,上期同期
#上年同期PY PY= CALCULATE([SalesAmount],DATEADD('Date'[Date],-1,Year)) 以上表達式等價於#1: [PY YTD Sales] := CALCULATE ( [Sales Amount], SAMEPERIODLASTYEAR ( DATESYTD ( 'Date'[Date] ) ) ) 等價於#2: [PY YTD Sales] := CALCULATE ( [Sales Amount], DATESYTD ( SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) ) 等價於#3: [YTD Sales] := CALCULATE ( [Sales Amount], DATESYTD('Date'[Date] ) ) [PY YTD Sales] := CALCULATE ( [YTD Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) 等價於#4: [PY Sales] := CALCULATE ( [Sales Amount], SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) [PY YTD Sales] := CALCULATE ( [PY Sales], DATESYTD ( 'Date'[Date] ) ) #上季同期PQ PQ= CALCULATE([SalesAmount],DATEADD('Date'[Date],-1,Quarter)) #上月同期PM PM=CALCULATE([SalesAmount],DATEADD('Date'[Date],-1,Month)) #上周同期PW(上周同日,七日前) PW= CALCULATE([SalesAmount],DATEADD('Date'[Date],-7,day)) #計算任意期間的上一期 1基礎度量值: 本期收入 = SUM('訂單表'[銷售額]) 2上期收入: VAR DateStart = MIN('Date'[Day_Date]) //當前期間的開始日期 VAR DateEnd = MAX('Date'[Day_Date]) //當前期間的結束日期 VAR DateRangeLength = DATEDIFF(DateStart,DateEnd,DAY) //當前期間的天數 VAR PreDateEnd = DateStart -1 //上期的結束日期 VAR PreDateStart = PreDateEnd - DateRangeLength //上期的開始日期 VAR PreDareRange = DATESBETWEEN('Date'[Day_Date],PreDateStart,PreDateEnd) //上個期間范圍 RETURN CALCULATE([本期收入],PreDareRange)
四,上期全部
#上年全部PYT(Previous Year Total) PYT= CALCULATE([SalesAmount],PARALLELPERIOD('Date'[Date],-1,Year)) #上季全部(Previous Year Total) PQT= CALCULATE([SalesAmount],PARALLELPERIOD('Date'[Date],-1,Quarter)) #上月全部(Previous Year Total) PYT= CALCULATE([SalesAmount],PARALLELPERIOD('Date'[Date],-1,Month)) #上周全部(Previous Week Total) PWT = IF( SELECTEDVALUE('DATE'[WEEKOFYEAR]) =1 || CALCULATE( COUNTROWS('DATE'), FILTER(ALL('DATE'),'DATE'[YEARWEEK] = SELECTEDVALUE('DATE'[YEARWEEK])-1) )<7, BLANK(), CALCULATE( [SALESAMOUNT], FILTER(ALL('DATE'),'DATE'[YEARWEEK] = SELECTEDVALUE('DATE'[YEARWEEK])-1))
五,去年
#去年同期 #計算去年同期利潤(精確至天) 利潤.新.YTD.PY.ByClaculateColumn= CALCULATE( [利潤.新], CALCULATETABLE( SAMEPERIODLASTYEAR ( '日期表'[日期] ), '日期表'[大於最后訂單日期] = TRUE )) #計算去年的年度至今利潤(精確至月) 利潤.新.PY.ByMeasure= VAR LastOrderDate =CALCULATE ( MAX ( '訂單表.新'[訂單日期] ), ALL ( '訂單表.新' ) ) VAR FirstDayInSelection =MIN ( '日期表'[日期] ) VAR ShowData = ( FirstDayInSelection <= LastOrderDate ) VAR Result =IF ( ShowData, CALCULATE ( [利潤.新], SAMEPERIODLASTYEAR ( '日期表'[日期] ) ) ) RETURN Result 等價於: 利潤.新.PY.ByMeasure.Correct= VAR LastOrderDate =CALCULATE ( MAX ( '訂單表.新'[訂單日期] ), ALL ( '訂單表.新' ) ) VAR CurrentDates =FILTER ( VALUES ( '日期表'[日期] ), '日期表'[日期] <= LastOrderDate ) VAR Result =CALCULATE ( [利潤.新], SAMEPERIODLASTYEAR ( CurrentDates ) ) RETURN Result #去年本季LY_QTD CALCULATE( [本季至今(QTD)], SAMEPERIODLASTYEAR('D_DATE'[DAY_DATE])) #去年本月LY_MTD CALCULATE( [本月至今(MTD)], SAMEPERIODLASTYEAR('D_DATE'[DAY_DATE])) #去年本周LY_WTD CALCULATE( [本周至今(WTD)], SAMEPERIODLASTYEAR('D_DATE'[DAY_DATE]))
注:以上只是個公式匯總,未全部驗證過。大概是這么個套路,應用時需要根據具體的數據和切片器做調整。
實戰 1 - 計算歷史月份和將來月份的匯總值
當前月份為202104,將歷史月份(202101 - 202104)標為YTD,剩余月份(202105 - 202112 )標為YTG;對應去年歷史(202001 - 202004)標為LY_YTD,去年剩余(202005 - 202012)標為LY_YTG
注:取當前日期 = NOW() , 取去年同期 = EDATE(NOW(),-12)
##DAX公式 Tag = VAR current_yearmonth = VALUE(FORMAT(NOW(),"YYYYMM")) VAR lastyearmonth = VALUE(FORMAT(EDATE(NOW(),-12),"YYYYMM")) VAR current_year = VALUE(YEAR(NOW())) VAR lastyear = VALUE(YEAR(EDATE(NOW(),-12))) Return Switch(TRUE(), 'YearMonth'[Year] = current_year && 'YearMonth'[YearMontNo] < current_yearmonth,"YTD", 'YearMonth'[Year] = current_year && 'YearMonth'[YearMontNo] >= current_yearmonth,"YTG", 'YearMonth'[Year] = lastyear && 'YearMonth'[YearMontNo] < lastyearmonth,"LY_YTD", 'YearMonth'[Year] = lastyear && 'YearMonth'[YearMontNo] >= lastyearmonth,"LY_YTG" )
實戰 2 - 用Fiscal Month做維度時,計算值不對
解決:參考財年計算,加上財年結束日期 - https://view.inews.qq.com/a/20210119A04WZG00
實戰3 - 計算LY_MTD沒值,日期表與事實表用Date_ID 關聯
解決:將Date 表標記為日期表,標記為日期表可以自動移除來自日期表其他列的篩選器,這種特性非常重要。
參考標記日期標的作用:https://www.powerbigeek.com/mark-as-date-table/