期末余额计算比较常见,比如,存货。DAX功能十分强大,丝毫不逊色MDX。
下面以一个实例说明,分别计算四种情况期末余额:
基本情况,地区表,商店表,数量表,日期表。
第一种情况,
2012
东城:5+3=8 (3/25/2012)
北城:0
南城:0
西城:8 (2/25/2012)
合计:5+3=8 (3/25/2012)
这种计算比较简单,
CALCULATE(SUM(Facts[Amount]),FILTER(DATE,'Date'[Date]=MAX(Facts[Date])))
CALCULATE(SUM(Facts[Amount]),LASTDATE(Facts[Date]))
类似MDX的LASTCHILD。
见下图,注意合计。
第二种情况,
2012
东城:5+3=8 (3/25/2012)
北城:0
南城:0
西城:21+8=29 (1/25/2012,2/25/2012)
合计:8+29=37
这种计算也不复杂,
SUMX(VALUES(Store[StoreId]),CALCULATE(SUM(Facts[Amount]),LASTDATE(Facts[Date])))
第三种情况,
2012
东城:5+3=8 (3/25/2012)
北城:14 (12/25/2012)
南城:11 (12/25/2012)
西城:8 (2/25/2012)
合计:8+14+11+8=41
这种计算很复杂,但是DAX足够强大,
SUMX(ADDCOLUMNS(ADDCOLUMNS(VALUES(Area[Name]),"LENEDate",CALCULATE(MAX(Facts[Date]),'Date'[Year]<=VALUES('Date'[Year]))),"Quantity",CALCULATE(SUM(Facts[Amount]),FILTER(ALL(DATE),'Date'[Date]=[LENEDate]))),[Quantity])
看下图,特别是合计和总计。
第四种情况,
2012
东城:5+3=8 (3/25/2012)
北城:14+7=21
南城:9+11=20
西城:21+8=29
合计:8+21+20+29=78
这种计算更加复杂,DAX表现非常出色。
SUMX(ADDCOLUMNS(ADDCOLUMNS(CROSSJOIN(VALUES(Store[Name]),VALUES(Area[Name])),"LENEDate",CALCULATE(MAX(Facts[Date]),'Date'[Year]<=VALUES('Date'[Year]))),"Quantity",CALCULATE(SUM(Facts[Amount]),FILTER(ALL(DATE),'Date'[Date]=[LENEDate]))),[Quantity])
最后,我们把这四种情况放在一起,作个比较,清晰明了,也可以体会DAX的强大和魅力。