人々とその資格を含むファクトテーブルがあります。ファクト テーブルには、StartStudyDate と EndStudyDate の 2 つの日付があります。これは、学生が勉強していた期間を表します。次に、Person ディメンション、Qualification ディメンション、Grouping ディメンション、および 1 つの Date ディメンションがあります。
特定の日に積極的に勉強していた学生の数を見つけようとしています。
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 のファクト テーブルに 2 つの列を追加することから始めました。
実際の開始日
=LOOKUPVALUE(
'Date'[Date],
'Date'[DateID],
'Appointment Detail'[StartDateID])
実際の終了日
=LOOKUPVALUE(
'Date'[Date],
'Date'[DateID],
'Appointment Detail'[EndDateID])
次に、1 つの日付が 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())
問題に関してここで何かが明らかに欠けているので、問題を正しく理解するのに役立ちます。また、私のダックスの経験も非常に軽いです。