SQL Сервер за последние 12 месяцев с begin_date и end_date - PullRequest
0 голосов
/ 26 мая 2020

У меня проблемы с отображением последних 12 месяцев для каждой записи, может ли кто-нибудь помочь? Прямо сейчас я могу отображать только один месяц для каждой записи.

DECLARE @DateEnd as DATETIME = DATEADD(month,((YEAR(getdate())-1900)*12) + MONTH(getdate())-1,-1)
--             SET @DateEnd =  '20191130'

DECLARE @Frequency_List table (FREQUENCY_ID char(3)); INSERT into @Frequency_List values ('118')    --                ('111'),('118'),('110')        --             'MTD','QTD','YTD'

DECLARE @Entity_List table (ENTITY_NAME char(50)); INSERT into @Entity_List values 
('F1000'),('R2202'),('R528'),('R810'),('R567'),('R402I'),('R508'),('F1000'),('A950A'),('R557'),('R559'),('R560'),('TBNOBL'),('ALTACORP'),('R590RVME'),('Z490'),('R5070'),('R591'),('R710')

select    P.PORTF_CODE, F.EXT_NAME, REPLACE(CONVERT(VARCHAR(10), AKRE.BEGIN_DATE, 102), '.', '-') as 'BEGIN_DATE', REPLACE(CONVERT(VARCHAR(10), AKRE.END_DATE, 102), '.', '-') as 'END_DATE', 
                                ISNULL(AKRE.PTF_END_OAD,0) 'PTF End Duration', ISNULL(AKRE.BMK_END_OAD,0) 'BMK End Duration', (ISNULL(AKRE.PTF_END_OAD,0)-ISNULL(AKRE.BMK_END_OAD,0)) 'Diff End Duration',
                                ISNULL(AKRE.PTF_END_OAS,0)*10000 'PTF End Spread', ISNULL(AKRE.BMK_END_OAS,0)*10000 'BMK End Spread', (ISNULL(AKRE.PTF_END_OAS,0)-ISNULL(AKRE.BMK_END_OAS,0))*10000 'Diff End Spread',
                                ((ISNULL(AKRE.PTF_END_OAD,0)*(ISNULL(AKRE.PTF_END_OAS,0)*10000))-(ISNULL(AKRE.BMK_END_OAD,0)*(ISNULL(AKRE.BMK_END_OAS,0)*10000))) 'DIF_END_DTS'

from BISAMDW..ATTX_KEY_RATES_EFFECTS AKRE 
left join BISAMDW..PORTFOLIO P on P.PORTF_ID = AKRE.PORTF_ID
left join BISAMDW..ATTR_INSTRUMENT AI on AI.ATINS_ID = AKRE.ATINS_ID
left join [BISAMDW].[dbo].[UD_GROUP] GRP on AKRE.USER_DEFINED_GROUP_ID=GRP.USER_DEFINED_GROUP_ID
left join BISAMDW..T_FREQUENCY F on F.FREQUENCY_ID = AKRE.FREQUENCY_ID

where AKRE.END_DATE = @DateEnd and P.PORTF_NAME in ( select ENTITY_NAME from @Entity_List) 
                and AKRE.PORTF_CONFIG_ID in ( 1 )
                and AKRE.FREQUENCY_ID in (select FREQUENCY_ID from @Frequency_List)
                and AKRE.PTF_RETURN is NOT null
                and GRP.EXT_CODE in ('BARCLAYS','MASTER_2016')         

order by 1,2

Результат для столбцов месяца начала и месяца в результат выборки должен быть примерно таким:

MonthStartDate  MonthEndDate
2011-04-01  2011-04-30
2011-05-01  2011-05-31
2011-06-01  2011-06-30
2011-07-01  2011-07-31
2011-08-01  2011-08-31
2011-09-01  2011-09-30
2011-10-01  2011-10-31
2011-11-01  2011-11-30
2011-12-01  2011-12-31
....

Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Лично я бы предложил создать Календарную таблицу (есть сотни примеров того, как их создать), если вам просто нужны даты начала и окончания каждого месяца. Тогда получение начальной и конечной дат из этой таблицы является тривиальным:

SELECT MIN(C.CalendarDate) AS MonthStart,
       MAX(C.CalendarDate) AS MonthEnd
FROM dbo.Calendar C
WHERE C.CalendarDate >= '20110101'
  AND C.CalendarDate < '20200601'
GROUP BY C.CalendarYear,
         C.CalendarMonth;

В качестве альтернативы вы можете использовать Tally для их генерации на лету:

DECLARE @StartDate date = '20110101',
        @EndDate date = '20200601';

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
    SELECT TOP (SELECT DATEDIFF(MONTH, @StartDate, @EndDate)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS I
    FROM N N1, N N2, N N3, N N4, N N5)
SELECT DATEADD(MONTH, T.I, @StartDate) AS MonthStart,
       EOMONTH(DATEADD(MONTH, T.I, @StartDate)) AS MonthEnd
FROM Tally T;
0 голосов
/ 26 мая 2020

Если вы хотите сгенерировать список начала и окончания месяца за последние 12 месяцев (плюс текущий месяц), тогда можно использовать рекурсивный запрос:

with cte as (
    select 
        dateadd(
            year, 
            -1, 
            datefromparts(year(getdate()), month(getdate()), 1)
        ) monthStartDate
    union all
    select dateadd(month, 1, monthStartDate)
    where monthStartDate < dateadd(month, -1, getdate())
)
select monthStartDate, eomonth(monthStartDate) monthEndDate from cte

Если вы собираетесь использовать эти данные несколько раз, вам следует сохранить результаты этого запроса в отдельной таблице, которую затем можно будет использовать непосредственно в своих запросах. Это называется календарной таблицей .

...