我有一个包含人员和资格的事实表。事实表有两个日期,StartStudyDate 和 EndStudyDate。这代表学生正在学习的时期。然后我有一个人员维度、资格维度、分组维度和一个日期维度。
我试图找出在特定日期积极学习的学生人数。
在 SQL 中它相对简单:
select a.PaygroupDescription, a.[Qualification], count(a.[PersonID])
from (
select distinct p.[PersonID], PaygroupDescription, q.[Qualification]
from [hr].[Appointment Detail] ad
join hr.Paygroup pg on ad.PaygroupID = pg.PaygroupID
join hr.Qualification q on q.QualificationID = ad.QualificationID
join hr.Person p on p.PersonID = ad.PersonID
join dimdate sd on sd.DateID = ad.StartDateID
join dimDate ed on ed.DateID = ad.EndDateID
where sd.date <= 20150101 and ed.date >= 20150101
) as a
group by a.PaygroupDescription, a.[Qualification]
问题是我无法弄清楚如何在 dax 中执行此操作。我首先在 TabularModel 的事实表中添加了两列:
实际开始日期
=LOOKUPVALUE(
'Date'[Date],
'Date'[DateID],
'Appointment Detail'[StartDateID])
实际结束日期
=LOOKUPVALUE(
'Date'[Date],
'Date'[DateID],
'Appointment Detail'[EndDateID])
然后我编写了检查是否从 DimDate 中选择了一个日期的度量,它获取所有不同的行,其中 selectedDate 为 <= ActualStartDate && >= ActualEndDate。
问题是它的行为就像一条绝对的狗。如果我尝试添加任何属性来分解数据,我会耗尽内存(至少在 32 位 excel 中)。我知道我可以尝试 64 位 excel,但我的数据集很小,所以内存应该不是问题。这是在我什至将过滤器添加到特定资格的计算之前:
EmployeeCount:=if(HASONEVALUE('Date'[Date]),
CALCULATE
(distinctcount('Appointment Detail'[PersonID]),
DATESBETWEEN('Date'[Date], min('Appointment Detail'[ActualStartDate]),Max( 'Appointment Detail'[ActualEndDate]))
)
,BLANK())
感谢您正确理解问题的帮助,因为我显然在这里遗漏了有关该问题的一些内容,并且我的 dax 经验也很轻松。