Добрый день, Коллеги)
Снова пишу с работы, поэтому пример в виде таблиц с разделителями)
Что требуется:
Необходимо в таблице A размножить строки на основании значения из таблицы B.
Что имеем:
Таблица A:
Код подразделения;Отдел;Статья;Сумма
1001;Анализ;1;100
1001;Анализ;2;200
1001;Планирование;1;100
1001;Планирование;2;200
1001;Продажи;1;100
1001;Продажи;2;200
1001;Развитие ;1;100
1001;Развитие ;2;200
1002;Анализ;1;100
1002;Планирование;1;100
1002;Продажи;1;100
1002;Развитие ;1;100
1003;Анализ;1;100
1003;Планирование;1;100
1003;Планирование;2;200
1003;Продажи;1;100
1003;Развитие ;1;100
Талица B:
Статья;Численность
1;3
2;7
Что необходимо: (на примере 1001 подразделения)
Необходимо затроить строки со статьёй 1 и усемерить строки со статьёй 7, т.е. на выходе получить вот такую картинку:
Код подразделения;Отдел;Статья;Сумма;Численность
1001;Анализ;1;100;3
1001;Анализ;1;100;3
1001;Анализ;1;100;3
1001;Анализ;2;200;7
1001;Анализ;2;200;7
1001;Анализ;2;200;7
1001;Анализ;2;200;7
1001;Анализ;2;200;7
1001;Анализ;2;200;7
1001;Анализ;2;200;7
1001;Планирование;1;100;3
1001;Планирование;1;100;3
1001;Планирование;1;100;3
1001;Планирование;2;200;7
1001;Планирование;2;200;7
1001;Планирование;2;200;7
1001;Планирование;2;200;7
1001;Планирование;2;200;7
1001;Планирование;2;200;7
1001;Планирование;2;200;7
Что делаю:
A:
LOAD [Код подразделения],
Отдел,
Статья,
Сумма
FROM
[A.txt]
(txt, codepage is 1251, embedded labels, delimiter is ';', msq);
left join(A)
LOAD Статья,
Численность
FROM
[B.txt]
(txt, codepage is 1251, embedded labels, delimiter is ';', msq);
Задачка вроде плевая, но я в ступоре и не могу додуматься в какую сторону копать.
Я реализовал такое решение:
пронумеровать строки с помощью RowNo() и запустить цикл от одного до max(RowNo), и используя autogenerate размножить строки. Но таких строк больше 200 000 для размножения и колонок соответственно тоже намного больше чем в моем примере. И я надеюсь, что есть более быстрый способ решения задачи, не используя цикл.
Вот реализовано решение. Все работает, но долго:
A:
LOAD RowNo() as RowNo,
[Код подразделения],
Отдел,
Статья,
Сумма
FROM
[C:\Users\koshelevda\Desktop\A.txt]
(txt, codepage is 1251, embedded labels, delimiter is ';', msq);
left join(A)
B:
LOAD Статья,
Численность
FROM
[C:\Users\koshelevda\Desktop\B.txt]
(txt, codepage is 1251, embedded labels, delimiter is ';', msq);
/*Находим max(Row)*/
MaxRow:
load max(RowNo) as MaxRow
Resident A;
Let vMaxRow = Peek('MaxRow', 0, 'MaxRow');
NoConcatenate
FactTable:
LOAD * INLINE [
RowNo
];
for i = 1 to $(vMaxRow)
NoConcatenate
Tmp:
Load *
Resident A
Where RowNo = $(i);
let vЧисленность = Peek('Численность', 0, 'Tmp');
Concatenate (FactTable)
load
RecNo()+(Iterno()-1) as NewRowNo,
Peek('RowNo', 0, 'Tmp') as RowNo,
Peek('Код подразделения', 0, 'Tmp') as [Код подразделения],
Peek('Отдел', 0, 'Tmp') as Отдел,
Peek('Статья', 0, 'Tmp') as Статья,
Peek('Сумма', 0, 'Tmp') as Сумма,
Peek('Численность', 0, 'Tmp') as Численность
Autogenerate 1
While RecNo()+(Iterno()-1) <= $(vЧисленность);
drop Table Tmp;
NEXT i
Drop table A;
exit script;