我有點問題圍繞着這個不斷變化的維度的邏輯。我想將以下兩張表聯繫起來。我需要根據ID和生效日期將成本期間事實表與成本維度相匹配。使用日期字段來匹配SQL查詢
正如您所看到的 - 如果月份和年份字段大於其關聯成本維度的生效日期,則應採用該值。一旦將新的生效日期輸入到維度中,它應該將該值用於大於所述日期的任何時間段。
編輯:我對缺乏細節表示歉意,但成本維度實際上會有一個唯一的索引值,並且匹配引用的變化字段爲資源,項目,成本。我試圖將您提供的查詢與我的字段進行匹配,但是我收到了錯誤的輸出。
FYI:命名約定的變化:EngagementId是標識,資源是ConsultantId,和項目是專案編號
我已經改變了下面的圖片,這裏是我的查詢
,_cte(HoursWorked, HoursBilled, Month, Year, EngagementId, ConsultantId, ConsultantName, ProjectId, ProjectName, ProjectRetainer, RoleId, Role, Rate, ConsultantRetainer, Salary, amount, EffectiveDate)
as
(
select sum(t.Duration), 0, Month(t.StartDate), Year(t.StartDate), t.EngagementId, c.ConsultantId, c.ConsultantName, c.ProjectId, c.ProjectName, c.ProjectRetainer, c.RoleId, c.Role, c.Rate, c.ConsultantRetainer,
c.Salary, 0, c.EffectiveDate
from timesheet t
left join Engagement c on t.EngagementId = c.EngagementId and Month(c.EffectiveDate) = Month(t.EndDate) and Year(c.EffectiveDate) = Year(t.EndDate)
group by Month(t.StartDate), Year(t.StartDate), t.EngagementId, c.ConsultantName, c.ConsultantId, c.ProjectId, c.ProjectName, c.ProjectRetainer, c.RoleId, c.Role, c.Rate, c.ConsultantRetainer,
c.Salary, c.EffectiveDate
)
select * from _cte where EffectiveDate is not null
union
select _cte.HoursWorked, _cte.HoursBilled, _cte.Month, _cte.Year, _cte.EngagementId, _cte.ConsultantId, _cte.ConsultantName, _cte.ProjectId, _Cte.ProjectName, _cte.ProjectRetainer, _cte.RoleId, _cte.Role, sub.Rate, _cte.ConsultantRetainer,_cte.Salary, _cte.amount, sub.EffectiveDate
from _cte
outer apply (
select top 1 EffectiveDate, Rate
from Engagement e
where e.ConsultantId = _cte.ConsultantId and e.ProjectId = _cte.ProjectId and e.RoleId = _cte.RoleId
and Month(e.EffectiveDate) < _cte.Month and Year(e.EffectiveDate) < _cte.Year
order by EffectiveDate desc
) sub
where _cte.EffectiveDate is null
例子:
我正在努力編寫與此一致的查詢。起初,我試圖按最大日期進行分組。但是,當我執行加入時,我獲得了每個單一時期(甚至是生效日期之前的最高生效日期)的最高生效日期。
這是可以在查詢中完成的事情,還是我應該專注於目標表的增量更新,以便過去的任何有效日期/時間段都是獨立的?
任何提示將是偉大的!
感謝, 錢寧
我們需要看到參與(最好的測試數據)表和參與SCD列的DDL。 – NickyvV
在SCD中調用的列是ConsultantId,ProjectId和RateId。不斷變化的領域是RateId。一旦新的費率被分配一個新的EngagementId被形成。然後,根據月份和年份,我們將這個新的作品與其ConsultantId和ProjectId對應的作品進行匹配。生效日期是在創建新費率時形成的。對於超過該生效日期的每個月一年,應該與新的顧問,項目和費率匹配。我們是否應該忽視Engagment,因爲它更關心顧問,項目和評分?創建顧問,項目和費率的合約關鍵? – Channing