2017-01-13 2 views
0

Это мое первое сообщение в этом форуме, и я очень новичок в SQL, поэтому, пожалуйста, несите меня.Добавление дополнительных критериев для правильного присоединения

Я пытаюсь изменить какой-либо существующий скрипт, чтобы внести небольшое изменение в отчет, чтобы сделать его немного более подходящим для цели (оригинал был составлен разработчиком).

В этом отчете рассматривается, были ли два конкретных файла зачитаны в базу данных для трех сущностей каждый месяц или отсутствуют ли они.

Результат выглядит любит ниже:

File A 
YYYY:MM:DD A MISSING 
      B MISSING 
      C MISSING 

YYYY:MM:DD A Present 
      B MISSING 
      C Present 

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

Ниже приводится соответствующая часть сценария:

select distinct(k.filedate) as filedate, k.fid, case when r.fundid is null then 0 else 1 end as present  
from XXXX database  
right join  
(  
    select convert(date,convert(varchar, year(@ReportDate) - 1) + '-12-01') as filedate, g.fid 
    from ( 
     select 'XXXXFDGBP10' as fid 
     union 
     select 'XXXXUSD10' as fid 
     union 
     select 'XXXXUSD10' as fid 
     union 
     select 'XXXXA10' as fid 
     union 
     select 'XXXXB10' as fid 
     union 
     select 'XXXXGBPMGMT10' as fid 
     union 
     select 'XXXXMGMTSH10' as fid 
    ) g 

    union 

    select convert(date,convert(varchar, year(@ReportDate)) + '-' + convert(varchar, h.m) + '-01') as filedate, s.fid 
    from ( 
     select 'XXXXFDGBP10' as fid 
     union 
     select 'XXXXUSD10' as fid 
     union 
     select 'XXXXUSD10' as fid 
     union 
     select 'XXXXA10' as fid 
     union 
     select 'XXXXB10' as fid 
     union 
     select 'XXXXGBPMGMT10' as fid 
     union 
     select 'XXXXMGMTSH10' as fid 
    ) s,  
    ( 
     select 1 as m 
     union 
     select 2 as m 
     union 
     select 3 as m 
     union 
     select 4 as m 
     union 
     select 5 as m 
     union 
     select 6 as m 
     union 
     select 7 as m 
     union 
     select 8 as m 
     union 
     select 9 as m 
     union 
     select 10 as m 
     union 
     select 11 as m 
     union 
     select 12 as m 
    ) h 
) k  
on r.fundid = k.fid and r.filedate = k.filedate  
where  
    k.filedate >= convert(date,convert(varchar, year(@ReportDate) - 1) + '-12-01') 
    and k.filedate <= @ReportDate 

Так что я хочу, чтобы добавить '11 -01' и '10 -01' до 2016 года возвращения доклада. Кто-нибудь знает, как я могу это сделать?

Заранее спасибо. Пожалуйста, дайте мне знать, если это не ясно или у кого есть какие-либо вопросы.

+0

Вы можете не просто изменить 12 на 10? Таким образом, он будет делать два дополнительных месяца каждый раз. – BishNaboB

+0

Извинения за поздний ответ на это предложение. К сожалению, это показывает только дату 2016-10, а не 2016-10 и 2016-11 и 2016-12, поэтому не работает. – idontknowwhatiamdoing

ответ

0

Я бы переписать запрос как

;WITH months AS 
(
    SELECT * FROM (VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12)) AS f("month") 
), 
years AS 
(
    SELECT * FROM (VALUES (year(@ReportDate)), (year(@ReportDate)-1)) AS f("year") 
), 
fids AS 
(
    SELECT * FROM (VALUES ('XXXXFDGBP10'), ('XXXXUSD10'), ('XXXXUSD10'), ('XXXXA10'), ('XXXXB10'), ('XXXXGBPMGMT10'), ('XXXXMGMTSH10')) AS f(fid) 
), 
k AS 
(
    SELECT 
     filedate = DATEADD(month, [month]-1, DATEADD(year, [year]-1900, 0)), 
     fid 
    FROM fids 
    CROSS JOIN years 
    CROSS JOIN months 
) 
SELECT 
    k.filedate, 
    k.fid, 
    present = case when r.fundid is null then 0 else 1 end  
FROM XXXX r 
RIGHT JOIN k ON r.fundid = k.fid and r.filedate = k.filedate 
where  
    k.filedate >= convert(date,convert(varchar, year(@ReportDate) - 1) + '-10-01') 
    and k.filedate <= @ReportDate 
Смежные вопросы