Изменения в запросе на основе года - PullRequest
1 голос
/ 27 октября 2010
    select datepart(month,s1.Timeperiod) as monthofaum, 
           datepart(YEAR,s1.Timeperiod) as Yearofaum,
           ISNULL(s2.endingAum,0) as Starting_Aum, 
           s1.endingAum as Ending_Aum
    from #temp_1 s1
    left outer join (select * from #temp_1)s2
    on month(s1.Timeperiod) = dateadd(D,1,month(s2.Timeperiod))

Это прекрасно работает для месячной базы, но, если мне нужно изменить запрос, чтобы получить результат, основанный также на годе, то лучше всего - где мне вносить изменения?

Example
    monthofaum  Yearofaum   Starting_Aum          Ending_Aum
    ----------- ----------- --------------------- ---------------------
    11          2009        0.00                  0.00
    12          2009        0.00                  1059594254.86
    1           2010        0.00                  1083195051.98
    2           2010        1083195051.98         1125314638.64
    3           2010        1125314638.64         1212355911.70
    4           2010        1212355911.70         1270374634.62
    5           2010        1270374634.62         1265193377.27
    6           2010        1265193377.27         1260776179.02
    7           2010        1260776179.02         2599205697.44
    8           2010        2599205697.44         1323838670.57

Если вы посмотрите на данные, то увидите, что для 2010 года значение Ending Aum предыдущего месяца будет равно Starting Aum следующего месяца, но когда дело доходит до 2009 года, Ending Aum декабрь не назначается на январь 2010 года. .

Это ошибка, которую мне нужно исправить.

Ответы [ 3 ]

0 голосов
/ 27 октября 2010

Чтобы настроить его на год, сравните только месяц и год. Например,

select convert(varchar(7), getdate(), 120)

Отпечатки 2010-10. Применительно к вашему запросу вы можете переписать on как:

on convert(varchar(7), s1.TimePeriod, 120) = 
   convert(varchar(7), DateAdd(year, 1, s2.TimePeriod), 120)

P.S. подзапрос не требуется. Эта строка:

 left outer join (select * from #temp_1)s2

точно так же, как:

 left outer join  #temp_1 s2
0 голосов
/ 28 октября 2010
select 
    datepart(month,s1.Timeperiod) as monthofaum, 
    datepart(YEAR,s1.Timeperiod) as Yearofaum,
    ISNULL(s2.endingAum,0) as Starting_Aum,  
    s1.endingAum as Ending_Aum 
from 
    #temp_1 s1 
left outer join 
    (select * from #temp_1) s2 on (month(s1.Timeperiod)-1 = month(s2.Timeperiod) 
                               or (month(s1.Timeperiod) = 1 and month(s2.Timeperiod) = 12))

Приведенный выше запрос работает, если таблица содержит только данные за 2 года. Я буду держать вас в курсе, если выясню проблему по вышеуказанному запросу

0 голосов
/ 27 октября 2010

Предполагается, что вам плевать на время, которое, я думаю, сработает ...

select datepart(month,s1.Timeperiod) as monthofaum,  
   datepart(YEAR,s1.Timeperiod) as Yearofaum, 
   ISNULL(s2.endingAum,0) as Starting_Aum,  
   s1.endingAum as Ending_Aum 
from #temp_1 s1 
left outer join (select * from #temp_1) s2 
on s1.TimePeriod = DateAdd(year,1,s2.TimePeriod)



РЕДАКТИРОВАТЬ:
Или, если вам небезразлично время, вы можете попробовать это (у меня есть функция для удобства) ...

1.Создать функцию dateonly

CREATE FUNCTION [dbo].[fn_DateOnly](@DateTime DATETIME)
-- Returns @DateTime at midnight; i.e., it removes the time portion of a DateTime value.
RETURNS  DATETIME
AS
BEGIN
RETURN DATEADD(dd,0, DATEDIFF(dd,0,@DateTime))
END

2. Это позволяет вам:

select datepart(month,s1.Timeperiod) as monthofaum,  
   datepart(YEAR,s1.Timeperiod) as Yearofaum, 
   ISNULL(s2.endingAum,0) as Starting_Aum,  
   s1.endingAum as Ending_Aum 
from #temp_1 s1 
left outer join (select * from #temp_1) s2 
on dbo.fn_DateOnly(s1.TimePeriod) = DateAdd(year,1,dbo.fn_DateOnly(s2.TimePeriod))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...