我有一个事实表,其中包含人和&他们的资格。事实表有两个日期,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中为事实表添加了两列:
ActualStartDate
=LOOKUPVALUE(
'Date'[Date],
'Date'[DateID],
'Appointment Detail'[StartDateID])
ActualEndDate
=LOOKUPVALUE(
'Date'[Date],
'Date'[DateID],
'Appointment Detail'[EndDateID])
然后我写了一个测量,检查是否从DimDate中选择了一个日期,它获得所有不同的行,其中selectedDate是&lt; = ActualStartDate&amp;&amp; &gt; = 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体验也很轻松。
答案 0 :(得分:0)
我会删除与DimDate的关系,然后使用类似以下模式的方法:
EmployeeCount := CALCULATE( COUNTROWS ( 'Person' ),
FILTER('Appointment Detail',
'Appointment Detail'[ActualStartDate] <= MAX(DimDate[Date])
&& 'Appointment Detail'[ActualEndDate] >= MIN(DimDate[Date])
))