Заполнение пропущенных месяцев при расчете с начала года - PullRequest
2 голосов
/ 20 мая 2019

У меня есть таблица с указанием суммарного года за

year month qty_ytd
2017   01    20
2017   02   30
2018   01    50

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

Результат в качестве примера:

year month qty_ytd
2017   01    20
2017   02   30
2017   03   30
.....
2017   07   30
2017   12   30

2018   01    50
2018   02    50
....
2018   12    50

Как это сделать?Я не понял, как заполнить пропущенные месяцы?

Ответы [ 2 ]

1 голос
/ 20 мая 2019

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

create table #t
(
 year int,
 month int, 
 qty_ytd int
);

insert #t(year, month, qty_ytd )
values
(2017,   01,   20),
(2017,   02,   30),
(2018,   04,   50) -- note month
;

select distinct year, month, sum(delta) over(partition by year order by  month)
from (
    -- real delta
    select year, month, delta = qty_ytd - isnull(lag(qty_ytd) over (partition by year order by month),0)
    from #t
    union all
    -- tally dummy delta
    select top(24) 2017 + (n-1)/12, n%12 + 1 , 0
    from 
    ( select row_number() over(order by a.n) n
      from
      (values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) a(n),
      (values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) b(n)
    ) c
)d
order by year, month;
1 голос
/ 20 мая 2019

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

select y.y, v.m, t.qty_ytd
from (select distinct year from t) y cross join
     (values (1), (2), (3), (4), . . . (12)) v(m) outer apply
     (select top (1) t.*
      from t
      where t.year = y.year and
            t.month <= y.m
      order by t.m desc
     ) t;

Предполагая, что qty_ytd не уменьшается, может быть более целесообразно использовать оконные функции:

select y.y, v.m,
       max(t.qty_ytd) over (partition by y.y order by v.m) as qty_ytd
from (select distinct year from t) y cross join
     (values (1), (2), (3), (4), . . . (12)) v(m) left join
     t
     on t.year = y.year and
        t.month = v.m;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...