Загрузка входных данных (остатки) на начало каждого года в Qlikview (Qlik Sense)

Автор Софья, 23 июля 2015, 01:20:30

« назад - далее »

admin

Привет.
Помимо руководства по Qlikview рекомендую почитать еще и по QLik Sense.
Дело в том, что на уровне ядра, скрипта - это очень похожие продукты, а документация по Sense отличается в лучшую сторону.
Загрузка и моделирование данных.pdf
Синтаксис скрипта и руководство по функциям диаграммы.pdf
Иван Шамаев в своем блоге сделал очень хорошую подборку материалов, рекомендую
Что касается больших данных.
Больших, насколько? Сколько записей в источнике?
Я считаю, что лучший вариант - сначала из SQL-источника выгружать черновые данные в QVD, и затем уже всю обработку делать средствами Qlikview.
Нагружать Sql-сервер из Qlikview лишний раз совершенно ни к чему.
Поэтому, на вашем месте я бы сделал акцент на обработчике источника данных, с целью формирования хранилища файлов формата QVD.
Из сложностей - на этом этапе придется решить вопрос с инкрементальной загрузкой.

DmitryK

Доброе утро, София!

Заранее прошу прощения...примеры ниже - придуманы с ходу и не особо вдумываясь)

1. Я работаю с dynamics ax 2012. Соответственно я качаю данные из MS Server.
И действительно, сколько данных в источнике? У меня с мая грузится около 10 млн строк и из них у меня получается на выходе почти 90 млн. (Гружу данные только с мая, остальные данные на конец месяца хранятся ы QVD) Если период нужен больше, то задаем период в переменной и лишнее затирается)

Отступление.
Для очистки QVD можно использовать вот такой кусочек кода:

QVDClearTable:
Load *
FROM
[Stock.qvd]
(qvd)
WHERE 1=0;

Store QVDClearTable Into Stock.qvd(qvd);
drop Table QVDClearTable;


Ну...продолжим :-)

2. Точно не могу ответить, не заострял на этом внимание, но вроде как, если грузишь простым запросом (SELECT ... FROM ... WHERE), то можно не прописывать  SQL и сразу над запросом использовать Load. А если использовать более сложные конструкции типа:
With table1 as (select...from...where)
table2 as (select...from...where)
SELECT...
FROM...
WHERE...

В этом случае необходимо начинать запрос с SQL With Table1...

После запроса SQL у меня нет Load, потому что он необязателен.
QlikView позволяет после выгрузки данных из SQL, сразу обрабатывать полученную таблицу с помощью синтаксиса QlikView.
Например для генерации ключа:

Load ITEMNAME,
AutoNumberHash128(ITEMID) as Key
Order by ITEMID; /* Гружу ранее загруженные поля, генерирую ключ, сортирую */
Select ITEMID ,
ITEMNAME
FROM INVENTTABLE
WHERE INVENTTYPE in (1,2);

Как видно, я обрабатываю данные на уровне SQL, а потом полученное на уровне QlikView. В QlikView есть много интересностей и удобных примочек, которых нет в SQL. Так же правдиво и обратное. Например
CASE
WHEN THEN
END
В QlikView нет. А прописывать все через if...честно сказать не удобно и дольше идет обработка.

3. Про Resident/drop/join:
- Resident
Загрузка из ранее загруженной таблицы. Пример. Из одной большой QVD надо получить Total суммы по Номенклатуре, и еще иметь группировку по Складам.Можно считать на уровне выражений, но если данных много, то ждать отчета - долгая песня. А QlikView "решает" за счет скорости построения :-) Поэтому будем считать на уровне скрипта.
P.s.: Мой совет. Старайтесь все расчеты по возможности делать в скрипте. Лучше пусть данные обновляются дольше, зато отчеты в приложениях будут строиться быстрее. Пользователи довольны..вы довольны)))

FactTable:
load Номенклатура,
        Склад,
        Сумма
From FactTable.qvd(qvd);
/* Формируем первую таблицу по номенклатуре */
SKUSum:
Load Номенклатура,
        sum(Сумма) as СуммаНоменклатура
Resident FactTable
Group by Номенклатура;
/* Формируем вторую таблицу по складам */
WarehouseSum:
Load Склад,
        sum(Сумма) as СуммаСклад
Resident FactTable
Group by Склад;


На Выходе получим 3 таблицы. FactTable, SKUSum, WarehouseSum.

- Drop
Удаление ранее загруженной таблицы.
- join
JOIN :-) Стандартный джоин (left, right, inner, outer). Только в SQL надо указывать связи. Тут связь идет по одинаковым названиям полей...
Например в SQL можно написать так:

Select *
FROM INVENTTRANS as InvTr
inner join

(Select ITEMID, ITEMNAME
FROM INVENTTABLE
WHERE INVENTTYPE IN (1,2)) as InvTable ON

InvTable.ITEMID = InvTr.ITEMID

В QlikView (представим что всё хранится в разных QVD):

InvTr:
load *
from InvTr.qvd(qvd);
inner join (InvTr)
load ItemId,
        ItemName
from InvTable
Where InventType = 1 and InventType = 2;

На выходе получим одно и то же. Проводки по номенклатуре с типом 1 и 2.

DmitryK

Цитата: admin от 29 июля  2015, 07:58:41  
Иван Шамаев в своем блоге сделал очень хорошую подборку материалов, рекомендую
Что касается больших данных.
Больших, насколько? Сколько записей в источнике?
Я считаю, что лучший вариант - сначала из SQL-источника выгружать черновые данные в QVD, и затем уже всю обработку делать средствами Qlikview.
Нагружать Sql-сервер из Qlikview лишний раз совершенно ни к чему.
Поэтому, на вашем месте я бы сделал акцент на обработчике источника данных, с целью формирования хранилища файлов формата QVD.
Из сложностей - на этом этапе придется решить вопрос с инкрементальной загрузкой.

Привет, admin!
Оооо! Иван просто великолепен! Как только он стал вести блог, Моё развитие по QlikView превратилось из черепахи в кролика!
Про остальное 100% правда.
Если посмотреть мой код, то первым делом я гружу данные (почти без обработки) и сохраняю в QVD, а вот уже потом начинается представление)))
Инкрементальная загрузка - отдельная тема и я предлагаю как-нибудь её создать и выделить красным!!!

to, София!
Совсем забыл. Если Вам необходимо учитывать Приход\расход, то Вам, ПО ИДЕЕ (Сам не пробовал, поэтому за правильность не отвечаю), просто надо тип проводки включить в состав Key. Тогда все группировки будут у вас на дату, ТипПроводки и другие измерения :-)
На выходе будете иметь 2 таблицы:
Stock:
Key, Дата, Измерение1, ИзмерениеN, ТипПроводки, _Количество, _КоличествоИтог
Где _Количество - сгруппированные проводки на дату по Ключу, _КоличествоИтог - Остаток на дату по Ключу.

Софья

Всем доброе утро.
Admin, в день несколько миллионов записей, точно не помню.
Спасибо отдельное вам Admin и DmitryK, очень много информации мне предоставили, буду теперь переваривать всё это и пробовать реализовывать.

DmitryK

Не за что) Всегда приятно поделиться полезной информацией) Главное иметь желание и время)
Надеюсь у Вас все получится!)

P.s.: Если получится оптимизировать "Остатки" на дату, то очень буду благодарен увидеть решение либо в этой теме, либо в новой)

С Уважением, Дмитрий :-)

DmitryK


Софья

Добрый день.
Решила проблему так - прогрузила необходимые QVD-файлы с историческими данными, а после сделала таблицу из 3-х полей (в разделе "Диаграммы" выбрала шаблон простой таблицы): Department, Product, Ostatok, а уже эту таблицу выгружала в Excel. Как раз решена была проблема с большим объёмом данных, потому что Excel-файлы занимают мегабайты, а QVD-файлы за тот же период - гигабайты.
Выгруженные данные, естественно, сверила, чтобы Excel корректно всё отображал, не было провалов в данных.
Выгружала данные по месяцам, сразу хочу предупредить, что когда выгружаете файл, и если данные в столбцах будут отображаться в экспоненциальном формате - "1,23E+10", вероятность почти 100%, что данные будут не совпадать с файлом QVD, с которого непосредственно была выгружена данная таблица. С чем это связано, пояснить не могу, но решить данную проблему можно. Просто дробите ещё выгрузку в Excel-файлы на меньшие периоды.
Возможно, конечно, что вам не понадобится это делать, просто у меня ну очень большой объём данных.
Ну и последним этапом, когда убедитесь, что выгрузка в Excel корректна, всё прогрузите, можно удалить QVD-файлы и подключаться непосредственно к Excel, как к источнику.
Резюмируя, получены необходимые исторические данные (в моём случае с детализацией, она мне необходима), и они занимают не больше гигабайта.


bibis

Цитата: Софья от 26 августа  2015, 05:47:13  
Excel-файлы занимают мегабайты, а QVD-файлы за тот же период - гигабайты.
Добрый день.
Ну вот это вот кстати очень странно.  всё обычно с точностью до наоборот. Ну и в любом случае тогда уж имеет смысл сохранять не .xls ,а .csv они точно меньше экселевских файлов.

admin

Может имеется в виду несколько однотипных qvd-файлов разбитых по периодам? В этом случае - да, размер будет большим из-за заголовка  в каждом qvd. Но если их объединить, то размер не должен быть больше xls.

Яндекс.Метрика