Что я хочу сделать, это продублировать предыдущую строку, если в ней отсутствует месяц данных для этого местоположения. При добавлении столбца, который добавит дату для этого месяца, который отсутствовал. Например, если бы он пропустил сентябрь, он поместил бы 01.09.2008 в новую колонку.
Итак, немного предыстории. Я просматриваю информацию о коллекциях для множества разных мест, которые по большей части собираются каждый месяц. Но иногда нет собраний в определенном месяце, и в этом случае мы хотим дублировать данные за недостающий месяц предыдущего месяца. Я думал, что смогу найти месяцы, которые пропустили сбор, создав столбец Month Diff
. Тогда мне просто нужно вставить один ряд различий в месяц. Поэтому, если разница составляет 3 месяца, я бы вставил три новые строки и добавил дополнительный столбец, в котором указана дата этого месяца.
Вот код, который у меня есть, но я застрял при добавлении в строки, и я не уверен, возможно ли это вообще.
Select
Location_ID,
Convert(Date,CONVERT(varchar(10),Collect_Month_Key,101)) as Collect_Date,
Calc_Gross_Totals,
Loc_Country,
CONVERT(varchar(8),Collect_Month_Key)+'-'+Location_ID as [Unique Key],
MONTH(Convert(Date,CONVERT(varchar(10),Collect_Month_Key,101))) as MONTH,
YEAR(Convert(Date,CONVERT(varchar(10),Collect_Month_Key,101))) as 'YEAR',
ROW_NUMBER() OVER(PARTITION BY Location_ID+'-'+left(Collect_Month_Key,4) ORDER BY Collect_Month_Key ASC) as 'INDEX',
Cast(
Case
when MONTH(Convert(Date,CONVERT(varchar(10),Collect_Month_Key,101))) > ROW_NUMBER() OVER(PARTITION BY Location_ID+'-'+left(Collect_Month_Key,4) ORDER BY Collect_Month_Key ASC)
Then MONTH(Convert(Date,CONVERT(varchar(10),Collect_Month_Key,101))) - ROW_NUMBER() OVER(PARTITION BY Location_ID+'-'+left(Collect_Month_Key,4) ORDER BY Collect_Month_Key ASC)
Else 0
End as bit) as 'Month Diff'
From FT_GPM_NPM_CYCLES AS cyc
INNER JOIN LU_Location AS loc ON cyc.Lu_Loc_Key = loc.LU_Loc_Key
INNER JOIN LU_Loc_Country AS cty ON loc.LU_Loc_Country_Key = cty.LU_Loc_Country_Key
Where
Collect_Month_Key <> -1 and
Convert(Date,CONVERT(varchar(10),Collect_Month_Key,101)) >= '2016-1-1'
Order By
Location_ID,
Collect_Date;`
Прилагается мой вывод в виде изображения, чтобы дать представление о том, как оно должно выглядеть.
