Присоединить к таблице сумму значений последних ненулевых строк за прошлый периоды
Есть Таблица 1 формата:
Provider | Date |
---|---|
001 | 01.03.2000 |
001 | 01.04.2000 |
(поставщиков > 1) В один месяц на 1,у поставщика может быть только одна дата, месяца могут пропускаться
и Таблица 2 формата:
Provider | Contract | Date | Sum |
---|---|---|---|
001 | 111111 | 01.01.2000 | 100 |
001 | 111111 | 01.03.2000 | 150 |
001 | 222222 | 01.01.2000 | 200 |
001 | 222222 | 01.04.2000 | 250 |
(> 1 поставщиков, > 1 договоров у каждого поставщика)
Как можно соединить вторую с первой, чтобы был появился у первой результирующие столбец суммы по поставщику и договору. Если дата пропускается, мы берём последнюю известную дату Например:
Provider | Date | Result |
---|---|---|
001 | 01.03.2000 | 150 + 200 |
001 | 01.04.2000 | 150 + 250 |
По контракту 111111 на 03 мес 150, по 222222 последняя известная сумма 200 По контракту 111111 на 04 мес последняя известная сумма 150, по 222222 250
Ответы (1 шт):
Пример
provider | date |
---|---|
001 | 2000-03-01 |
001 | 2000-04-01 |
provider | contract | date | summa |
---|---|---|---|
001 | 111111 | 2000-01-01 | 100 |
001 | 111111 | 2000-03-01 | 150 |
001 | 222222 | 2000-01-01 | 200 |
001 | 222222 | 2000-04-01 | 250 |
Присоединяем к каждой строке таблицы1 все строки данного поставщика из таблицы2 и нумеруем по убыванию даты в пределах каждого договора.
select *
,row_number()over(partition by t1.provider,t1.date,t2.contract
order by t2.date desc)rn
from table1 t1
left join table2 t2 on t2.provider=t1.provider
and t2.date<=t1.date
order by t1.provider,t1.date,t2.date
provider | date | provider | contract | date | summa | rn |
---|---|---|---|---|---|---|
001 | 2000-03-01 | 001 | 111111 | 2000-01-01 | 100 | 2 |
001 | 2000-03-01 | 001 | 222222 | 2000-01-01 | 200 | 1 |
001 | 2000-03-01 | 001 | 111111 | 2000-03-01 | 150 | 1 |
001 | 2000-04-01 | 001 | 222222 | 2000-01-01 | 200 | 2 |
001 | 2000-04-01 | 001 | 111111 | 2000-01-01 | 100 | 2 |
001 | 2000-04-01 | 001 | 111111 | 2000-03-01 | 150 | 1 |
001 | 2000-04-01 | 001 | 222222 | 2000-04-01 | 250 | 1 |
итоговое суммирование
select provider,date,sum(summa)summa
,string_agg(cast(summa as varchar),'+')s
from(
select t1.provider,t1.date,t2.summa,t2.date rdate
,row_number()over(partition by t1.provider,t1.date,t2.contract
order by t2.date desc)rn
from table1 t1
left join table2 t2 on t2.provider=t1.provider
and t2.date<=t1.date
)a
where rn=1
group by provider,date
order by provider,date
provider | date | summa | s |
---|---|---|---|
001 | 2000-03-01 | 350 | 150+200 |
001 | 2000-04-01 | 400 | 150+250 |