Вместо Talend
это должно быть выполнено на самом Sql Server
, и тогда вы можете просто получить данные и работать соответственно в вашем Talend Studio
.
Ваш сценарий является примером поиска промежуточного итога на основе некоторого идентификатора и диапазона дат. Я выполнил поиск текущей суммы, используя CROSS APPLY
, если вы используете версию + 1007 2012+, было бы гораздо больше вариантов для вас. Чтобы узнать диапазон дат, я использовал LEAD
, который идентифицировал бы следующую следующую строку на основе идентификатора.
Следующий запрос сработает за вас -
Настройка данных:
create table #temp(id_facture nvarchar(100), produit nvarchar(100), mouvment nvarchar(100), quantité_Stock int, stockDate date)
insert into #temp
select 'f1', 'p1', 'entrée', 50, '04/28/2018' union all
select 'f2', 'p1', 'entrée', 10, '05/01/2018' union all
select 'f3', 'p1', 'sortie', -20, '05/02/2018' union all
select 'f3', 'p2', 'entrée', 4, '05/02/2018' union all
select 'f4', 'p2', 'sortie', -1, '05/03/2018' union all
select 'f4', 'p1', 'entrée', 2, '05/03/2018'
Фактический код:
;WITH CTE1 AS (select
T.id_facture, T.produit,T.mouvment,rt.runningTotal,T.stockDate
from #temp t
cross apply (select sum(quantité_Stock) as runningTotal
from #temp
where produit = t.produit
and stockDate <= t.stockDate
) as rt),
DateList (id_facture,produit,mouvment,runningTotal,stockDate,stockDateEnd)
AS (
SELECT id_facture,produit,mouvment,runningTotal
, stockDate
, LEAD(stockDate, 1) OVER ( PARTITION BY produit ORDER BY stockDate ) AS stockDateEnd
FROM CTE1
UNION ALL
SELECT id_facture,produit,mouvment,runningTotal,DATEADD(DAY,1,stockDate),stockDateEnd FROM DateList
WHERE DATEADD(DAY,1,stockDate) < stockDateEnd
)
SELECT id_facture,produit,mouvment,runningTotal as quantité_Stock,stockDate FROM DateList ORDER BY produit,stockDate