2016-09-13 176 views
0

我有點問題圍繞着這個不斷變化的維度的邏輯。我想將以下兩張表聯繫起來。我需要根據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 

例子:

enter image description here

enter image description here

enter image description here

我正在努力編寫與此一致的查詢。起初,我試圖按最大日期進行分組。但是,當我執行加入時,我獲得了每個單一時期(甚至是生效日期之前的最高生效日期)的最高生效日期。

這是可以在查詢中完成的事情,還是我應該專注於目標表的增量更新,以便過去的任何有效日期/時間段都是獨立的?

任何提示將是偉大的!

感謝, 錢寧

+1

我們需要看到參與(最好的測試數據)表和參與SCD列的DDL。 – NickyvV

+0

在SCD中調用的列是ConsultantId,ProjectId和RateId。不斷變化的領域是RateId。一旦新的費率被分配一個新的EngagementId被形成。然後,根據月份和年份,我們將這個新的作品與其ConsultantId和ProjectId對應的作品進行匹配。生效日期是在創建新費率時形成的。對於超過該生效日期的每個月一年,應該與新的顧問,項目和費率匹配。我們是否應該忽視Engagment,因爲它更關心顧問,項目和評分?創建顧問,項目和費率的合約關鍵? – Channing

回答

0

試試這個:

; with _CTE as(
    select p.* , c.EffectiveDate, c.Cost 
    from period p 
     left join CostDimension c on p.id = c.id and p.Month = DATEPART(month, c.EffectiveDate) and p.year = DATEPART (year, EffectiveDate) 
) 
select * from _CTE Where EffectiveDate is not null 

Union 

select _CTE.id, _CTE.Month, _CTE.Year, sub.EffectiveDate, sub.Cost 
from _CTE 
    outer apply (select top 1 EffectiveDate, Cost 
        from CostDimension as cd 
        where cd.Id = _CTE.id and cd.EffectiveDate < DATETIMEFROMPARTS(_CTE.Year, _CTE.Month, 1, 0, 0, 0, 0) 
        order by EffectiveDate desc 
       ) sub 
where _Cte.EffectiveDate is null 
+0

我對該帖子進行了修改以澄清。我將加入兩個單獨的表格。我希望加入時考慮到更改/日期和成本。對不起,如果我太模糊了! – Channing

+0

所以,只是爲了澄清...'成本 - 期間事實'是你的預期產出,另外兩個表是輸入。對? – Sparrow

+0

是的,我將加入期間和成本。每增加一個新的生效日期後,我都希望從那一刻開始的所有時間段都能反映出適當的成本,同時還要保留任何期間/更改之前的成本。 – Channing