khtan
In (Som, Ni, Yak)
17689 Posts |
Posted - 2007-05-17 : 19:29:02
|
[code]declare @tbl table( [DATE] datetime, VALUE decimal(10,2), TERM_YEAR int)insert into @tblselect '20050101', 500, 3 union allselect '20060708', 800, 1declare @min datetime, @max datetimeselect @min = min([DATE]), @max = max(dateadd(year, TERM_YEAR, dateadd(month, datediff(month, 0, [DATE]), 0) - 1))from @tbl tselect [DATE], [VALUE] = convert(decimal(10,2), sum(VALUE)), [TOTAL] = convert(decimal(10,2), sum(TOTAL))from( select d.[DATE], VALUE = case when d.[DATE] <= t.end_date then round(t.VALUE / (TERM_YEAR * 12), 2) else 0 end, TOTAL = case when d.[DATE] <= t.end_date then round(t.VALUE / (TERM_YEAR * 12), 2) * (datediff(month, t.[DATE], d.[DATE]) + 1) else round(t.VALUE / (TERM_YEAR * 12), 2) * (t.TERM_YEAR * 12) end from dbo.F_TABLE_DATE(@min, @max) d left join ( select [DATE], [VALUE], [TERM_YEAR], start_date = dateadd(month, datediff(month, 0, [DATE]), 0), end_date = dateadd(year, TERM_YEAR, dateadd(month, datediff(month, 0, [DATE]), 0) - 1) from @tbl ) t on d.[DATE] >= start_date where d.DAY_OF_MONTH = 1) agroup by [DATE]order by [DATE][/code] KH |
 |
|