Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
Chernov
Creator
Creator

Две таблицы фактов - списания и продажи - вопрос по формуле в таблице

Привет всем,

Уже не первый день бьюсь с решением одной простой/непростой задачи, а именно расчёт суммы, по полю к которому эта сумма не относится в динамической таблице QlikView.

Итак, есть набор данных, приведу код(автогенерация), его может любой повторить

let vDateStart = num(MakeDate(2017,9,1));

Продажи:

LOAD

   num(rand() * 500,'# ##0,00') as Сумма

   , date(daystart($(vDateStart) + (30 * rand()))) as Дата

   , ceil(rand() * 20) as Количество

   , 'Магазин' & ceil(rand()*5) as Магазин

   , 'Товар' & ceil(rand()*30) as Товар

   , 'Группа' & ceil(rand()*3) as Группа

   , 1 as ТипДвижения

Autogenerate 10000;

Списания:

LOAD

   num(rand() * 100,'# ##0,00') as Сумма

   , date(daystart($(vDateStart) + (30 * rand()))) as Дата

   , ceil(rand() * 5) as Количество

   , 'Магазин' & ceil(rand()*5) as Магазин

   , 'Товар' & ceil(rand()*30) as Товар

   , 'Группа' & ceil(rand()*3) as Группа

   , 'Операция' & ceil(rand()*5) as Операция

   , 2 as ТипДвижения

Autogenerate 500;

Join(Продажи)

LOAD * resident Списания;

drop table Списания;

NoConcatenate

Продажи2:

Load

   *

   , Year(Дата) & '-' & Month(Дата) as МесяцГод

resident Продажи;

Drop table Продажи;

В итоге нам нужна динамическая таблица (не буду описывать как она делается), но в ней должны быть измерения: периоды(дата, неделя, месяц и всё остальное), товары (в том числе их родители: группа, направление, категория), магазины (и регионы и города), тип списания.

Суть в том, что если мы отображаем в таблице "тип списания", то у нас на каждой строчке - должна быть одинаковая сумма продаж.

Конечно, списания проходят не каждый день, а продажи - чаще ежедневны.

На скриншоте, показываю две сводные таблицы (pivot table), в верхней - нет операций и сумма считается, в нижней - есть операции и сумма не отображается.

Нужно как я уже выше писал - при отображении типов списаний - писать суммы продаж, не взирая на типы.

Причём, например, если у нас в таблице будут измерения: месяц, категория, тип операции - нужно считать сумму продаж в том числе на каждую категорию, и так же писать одну и ту же сумму на каждой строке с типом операции.

P.S. перепробовал уже много вариантов решения - не одно ни привело к успеху, в частности : джоины, конкатенейты, расчёты через переменные, разбивание на отдельные таблицы, переименовывания полей и т.д.

Вот пока этот текст писал, подумал, и кажется остался один вариант через альтернативные состояния, и период через переменные - но кажется я этот вариант тоже уже делал...

1 Solution

Accepted Solutions
Anna_Klimkova
Employee
Employee

Станислав,

было бы проще разбираться, если бы также выложили файл .qvw для примера и картинку желаемого результата.

Я понимаю, что вы почти все перепробовали, но почему не устраивает самый простой вариант?

На скрине pivot table в нижнем левом углу у вас видимо стоит галочка Supress When Value is Null для измерения Операция.

Если эту опцию выключить (или в таблице Продажи в скрипте завести поле Операция со значением "Операция продажи"), по крайней мере все суммы по продажам будет видно.

Если они нужны одинаковыми внутри измерения Операция:

sum({<ТипДвижения= {1}>} Total <Магазин,Дата,Группа,Товар>   Сумма)

View solution in original post

13 Replies
antonaks
Creator II
Creator II

Здравствуйте. Вы пробовали соединить две таблицы фактов и параллельно использовать мастер календарь?

Что бы отличать данные таблиц, создайте в каждой из таблиц поле "Тип данных", в котором укажите тип: продажи и списания.

Ну и надо будет в set analysis сделать разделение.

Chernov
Creator
Creator
Author

Сразу описал в первом сообщение - пробовал и в скрипте это описано. И через Set analysis тоже пробовал.

sharpjoki
Contributor II
Contributor II

Добрый день. Приложите qvw файл с диаграммами, покажите, как вы рассчитываете суммы в выражениях.

Chernov
Creator
Creator
Author

Во вложении

sharpjoki
Contributor II
Contributor II

Попробуйте, вот так, добавив нулевое поле "Операция" в таблицу продаж, и сконкатенировав обе таблицы.

Chernov
Creator
Creator
Author

Наверно вы немного не поняли,

ТипДвижения - используется для отделения таблиц Списаний и Продаж, если значение = 1 то это сумма продаж, если 2 - то это сумма списаний.

Тип движения мне не нужно указывать в таблице и отбора по нему не будет.

Давайте по другому опишу, что есть и что нужно сделать.

sharpjoki
Contributor II
Contributor II

В таком случае, наверное, имеет смысл плясать от полей таблицы списаний, левым соединением потом присоединяя к ней таблицу продаж.

Есть возможность скрипт загрузки доработать таким образом, как в примере?

В диаграмме - примерный вид.

Chernov
Creator
Creator
Author

При таком варианте, и я его тоже пробовал - не подходит, т.к. итоговые строки нужны.

И собственно при одной продаже в 175,258 руб, на итоге увидим 351 руб - что не верно.

И таблица, динамическая, подчеркиваю.

Мы никогда не можем знать сколько у нас строк в таблице, это зависит от пользователей..

sharpjoki
Contributor II
Contributor II

Ну смотрите, поскольку мы уже по факту таблицу продаж присоединили левым соединением к таблице списаний, то наверное можно смело в функциях расчета суммы продаж указывать префикс DISTINCT, поскольку в рамках выводимых измерений 100% данная сумма продаж и количество продаж повторяться не будут, поскольку они у нас уже предварительно в скрипте по этим измерениям сгруппированы.

Пример с фильтром во вложении.