Power BI - 計算累計一(WTD,YTD,MTD,QTD)


參考教程:

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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM