具有多个TOPN循环的PowerBI复杂计算列
使用下面的信息,我需要在DAX中创建一个名为table的新表 我的问题是,“新值”列的以下度量值仅返回saleID的TOPN审核记录(只要审核记录可以包含介于“更改日期”和“有效期至”日期之间的销售日期)。应调整此过滤器,以仅检测“更改日期”是否发生在“销售日期”当天或之后。“有效期至”列不应包含在此计算中具有多个TOPN循环的PowerBI复杂计算列,powerbi,dax,calculated-columns,Powerbi,Dax,Calculated Columns,使用下面的信息,我需要在DAX中创建一个名为table的新表 我的问题是,“新值”列的以下度量值仅返回saleID的TOPN审核记录(只要审核记录可以包含介于“更改日期”和“有效期至”日期之间的销售日期)。应调整此过滤器,以仅检测“更改日期”是否发生在“销售日期”当天或之后。“有效期至”列不应包含在此计算中 new value = VAR CurrentContractDate = [Sale Date] RETURN VAR RespEmp = TOPN (
new value =
VAR CurrentContractDate = [Sale Date]
RETURN
VAR RespEmp =
TOPN (
1,
DynamicsAudit,
IF (
CurrentContractDate <= DynamicsAudit[Valid Until]
&& CurrentContractDate >= DynamicsAudit[Changed Date], //Check, whether there is matching date
DATEDIFF ( DynamicsAudit[Changed Date], DynamicsAudit[Valid Until], DAY ), //If so, rank matching locations (you may want to employ a different formula)
MIN ( //If the location is not matching, calculate how close it is (from both start and end date)
ABS ( DATEDIFF ( CurrentContractDate, DynamicsAudit[Changed Date], DAY ) ),
ABS ( DATEDIFF ( CurrentContractDate, DynamicsAudit[Valid Until], DAY ) )
) + 1000000 //Add a discriminating factor in case there are matching rows that should be favoured over non-matching.
), 1
)
RETURN
SELECTCOLUMNS( RespEmp,"ResponsibleEmployee", [new value] )
新值=
VAR CurrentContractDate=[销售日期]
返回
VAR RespEmp=
托普恩(
1.
动态审计,
如果(
CurrentContractDate=DynamicsAudit[更改日期],//检查是否有匹配日期
DATEDIFF(DynamicsAudit[更改日期]、DynamicsAudit[有效期至]、天),//如果是,则排列匹配位置(您可能需要使用不同的公式)
MIN(//如果位置不匹配,计算距离(从开始日期到结束日期)
ABS(DATEDIFF(当前合同日期,动态审计[更改日期],天)),
ABS(DATEDIFF(当前合同日期,动态审计[有效期至],天))
)+1000000//如果存在应优先于非匹配的匹配行,则添加判别系数。
), 1
)
返回
选择列(RespEmp,“ResponsibleeEmployee”、[新值])
那么,这样一个复杂的过滤器是什么样子的呢?新值=
new value =
VAR sale = [SaleID]
VAR saleDate = [Sale Date]
VAR tbl = SUMMARIZE(FILTER(DynamicsAudit, DynamicsAudit[SaleID] = sale && DynamicsAudit[Changed Date] >= saleDate),DynamicsAudit[new value])
VAR tbl2 = NATURALINNERJOIN(
FILTER(DbEmployees, DbEmployees[StartDate]<=saleDate && DbEmployees[EndDate] >= saleDate),
CALCULATETABLE(DynamicsContacts, TREATAS(tbl, DynamicsContacts[EmployeeID])))
RETURN MAXX(TOPN(1,tbl2, IF(DbEmployees[Position] = "clerk", 1,2), ASC), DynamicsContacts[EmployeeID])
VAR销售=[SaleID]
VAR saleDate=[销售日期]
VAR tbl=summary(过滤器(dynamicsudit,dynamicsudit[SaleID]=sale&&dynamicsudit[Changed Date]>=saleDate),dynamicsudit[new value])
变量tbl2=NATURALINNERJOIN(
过滤器(DbEmployees,DbEmployees[StartDate]=saleDate),
可计算(DynamicContacts,TREATAS(tbl,DynamicContacts[EmployeeID]))
返回MAXX(TOPN(1,tbl2,IF(DbEmployees[Position]=“clerk”,1,2),ASC),dynamiccontacts[EmployeeID])
第一个表表达式获取符合条件的员工列表
第二个表表达式联接员工(按在销售日期期间合同处于活动状态的人过滤)和联系人(按符合条件的人过滤)
最后做一个Top 1,首先挑选职员,然后挑选经理。你有什么具体问题吗?你能用一句话表达它吗?如果你想解决一个复杂的生产问题,找时间把它分成几个问题,这些问题可以用一句话来表达。如果您能够更麻烦地提供手工制作的示例数据,而不仅仅是复制粘贴您的生产环境,那将是非常棒的。如果您使用简单的数据重新创建生产问题,您有90%的机会自己解决它。如果你不想费心去设计可能为他人服务的教育问题,那么有一些自由职业者平台。第一句话为你提供了手工制作的示例数据。问题在一句话中,在示例代码的正下方指出。你所要求的一切都已经存在了。你试图使用DAX做的事情非常困难,你没有办法以不同的方式准备数据模型吗?例如,将员工和联系人合并?不太可能。这两个表来自不同的数据库,实际上使用的是一个关系表,因为它是一个多对多关系。。。