Неофициальный форум пользователей Qlik Sense & Qlikview

Для разработчиков => Вопросы по Qlik Sense & QlikView => Тема начата: DmitryK от 21 июля 2017, 12:29:28

Название: Размножение строк в скрипте QlikView
Отправлено: DmitryK от 21 июля 2017, 12:29:28
Добрый день, Коллеги)

Снова пишу с работы, поэтому пример в виде таблиц с разделителями)

Что требуется:
Необходимо в таблице 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;