2016-07-14 17 views
0

我有僱員每年更換費率,有時一年更換幾次。試圖找出年度的最後一個匯率,並且如果年度沒有匯率變化,那麼就要拉低前一年的匯率。我已經獲得了這一年的最後一個記錄,但是在使用之前沒有變化的年份值時遇到了困難。理想情況下,我每年都會得到一個結果。但是說到這一點,我意識到可能會很快失去控制。因此,如果2008年和2010年的費率有所下降,但2009年的費率不會,我需要2008年的費率才能顯示2009年。使用SQL Server 2008 R2 考慮使用日曆來做跨應用或外應用,但我一直在轉身。 我已經創建了日曆,使用Todd Fifield發佈,並在年份中添加年值。 http://www.sqlservercentral.com/articles/T-SQL/70482/每年需要最後的價值和以前的價值,如果年份爲空

這是我迄今爲止

with YrHist as 
(
select h.HRCo, h.HRRef, h.EffectiveDate, YEAR(h.EffectiveDate) as EffectiveYr,DATEADD(m,DATEDIFF(m,0,h.EffectiveDate),0) as EffMth, h.Type, h.NewSalary, h.OldSalary 

from HRSH h 
     left outer join PREHName p on h.HRCo=p.PRCo and h.HRRef=p.Employee 
) 

select distinct ROW_NUMBER() over(Order By tt.HRCo,tt.HRRef,tt.EffectiveYr) as RowID, 
tt.HRCo, tt.HRRef,tt.EffMth, tt.EffectiveYr, tt.EffectiveDate, tt.Type, tt.NewSalary as MaxRateForYr, tt.OldSalary 

from YrHist as tt 

     inner join 
      (select HRCo, HRRef, EffectiveYr, MAX(EffectiveDate) as MaxEffDate 
      from YrHist 
      Group By HRCo, HRRef, EffectiveYr) as m on tt.EffectiveYr=m.EffectiveYr and tt.EffectiveDate=m.MaxEffDate and tt.HRCo=m.HRCo and tt.HRRef=m.HRRef 

Example of Results

+0

想知道如果聯盟所有加入日曆和使用COALESCE可能會得到我在找什麼。 – Kerry

+0

結束更換表格;而不是查看保持工資變化的表格,我使用表格來檢查歷史記錄,並使用每年的最大日期。 – Kerry

回答

0

你可以用這個例子和解決您的問題

假設你有包括所有年份的日曆表

create table #cal (Yr int) 
insert into #cal values (2010), (2011), (2012), (2013), (2014), (2015), (2016) 

並假設這是你每年的費率表

with x as (
    select 1 AS ID, 2010 AS Y, 58 AS Rate 
    union 
    select 2, 2011, 48 
    union 
    select 3, 2013, 38 
    union 
    select 4, 2013, 59 
    union 
    select 5, 2014, 68 
    union 
    select 6, 2014, 78 
    union 
    select 7, 2014, 56 
    union 
    select 8, 2016, 45 
) 
select * into #t from x 

那麼這個查詢會給你你正在尋找

select Yr 
, isnull(max(cc.Rate), (select top 1 Rate from #t where Y < Yr order by ID desc)) Rate 
from #cal 
    left join #t ot on #cal.Yr = ot.Y 
    outer apply (select top 1 ID, Rate from #t where Y = ot.Y order by ID desc) AS cc 
group by #cal.Yr 

結果

╔══════╦══════╗ 
║ Yr ║ Rate ║ 
╠══════╬══════╣ 
║ 2010 ║ 58 ║ 
╠══════╬══════╣ 
║ 2011 ║ 48 ║ 
╠══════╬══════╣ 
║ 2012 ║ 48 ║ 
╠══════╬══════╣ 
║ 2013 ║ 59 ║ 
╠══════╬══════╣ 
║ 2014 ║ 56 ║ 
╠══════╬══════╣ 
║ 2015 ║ 56 ║ 
╠══════╬══════╣ 
║ 2016 ║ 45 ║ 
╚══════╩══════╝ 
+0

不知道這會適用於我的情況。如果我只是爲一名員工跑步,那就行得通了,但我要根據他們每年的費率爲所有員工提供這個服務。 – Kerry

+0

當我有機會時,我會嘗試將此應用於您的查詢 – FLICKER

1

結果結束更換表格;而不是查看保持工資變化的表格,我使用表格來檢查歷史記錄,並使用每年的最大日期。

相關問題