最近在做一个数据模型时,第一次体验到CALCULATETABLE()的威力。
数据模型如下:
数据模型
“单位列”来自于“部门人员报表”,因为所有人员信息都在此表内,“人员登录报表”通过账号与“部门人员报表”建立1对多的关系。这个1对多关系让我困扰好久,其实可以这样理解:“人员登录表”的每一个账号都可以在“部门人员表”找到,但是“部门人员报表”里却有很多家伙从来没登陆过,所以在“人员登录报表”找不着。
【注意】“人员登录报表”里的“单位”列是我没用CALCULATETABLE()之前,发现计算错误,从而保留了这一列(其实也是偷懒,忘记删除它了)。其实在实际的数据模型及后面的运算中,这一列没有必要——因为人员的所有属性信息都在“部门人员报表”里。
包含CALCULATETABLE()的正确字段公式:
总登陆次数:=CALCULATE(SUM([登录总次数]),'部门人员报表'[是否管理员]="FALSE",'部门人员报表'[状态]="启用",CALCULATETABLE('部门人员报表'))
不包含CALCULATETABLE()的错误字段公式:
test:=CALCULATE(SUM([登录总次数]),'部门人员报表'[是否管理员]="FALSE",'部门人员报表'[状态]="启用")
最后的计算结果如下:
计算结果
作为对照,我在右边创建了一个单独的不包含任何部门信息的数据透视表,只有一个数据:总的登陆次数。可以发现,计算错误的字段里的值,就是总的登陆次数,换句话说,没有筛选。
我最开始计算的时候犯这样的错误,也证明了我对数据模型的核心——关系——理解多么不到位。唉。