etl: можем ли мы агрегировать динамическое количество строк и добавить датированный, используя -Talend-Open-Studio - PullRequest
0 голосов
/ 03 мая 2018

Я новичок в Talend Open Studio и пытаюсь выполнить приведенные ниже преобразования.

Из таблицы фактов SQL-сервера, содержащей:

id_facture  produit   mouvment    quantité_Stock    Date 
--------------------------------------------------------------
f1          p1        entrée      +50               28/04/2018
f2          p1        entrée      +10               01/05/2018
f3          p1        sortie      -20               02/05/2018
f3          p2        entrée      +4                02/05/2018
f4          p2        sortie      -1                03/05/2018
f4          p1         entrée     +2                03/05/2018

Я хочу произвести эту таблицу:

id_facture  produit   mouvment    quantité_Stock  Date 
-----------------------------------------------------------
f1          p1        entrée      50             28/04/2018
f1          p1        aucune      50             29/04/2018
f1          p1        aucune      50             30/04/2018
f2          p1        entrée      60             01/05/2018
f3          p1        sortie      40             02/05/2018
f3          p2        entrée      4              02/05/2018
f4          p2        sortie      3              03/05/2018
f4          p1        entrée      42             03/05/2018

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

1 Ответ

0 голосов
/ 08 мая 2018

Вместо 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...