Проблема с датами в Qlikview / Qlik Sense

Автор mutniyglaz, февраля 17, 2015, 11:19:37 am

« предыдущая - следующая »

mutniyglaz

февраля 17, 2015, 11:19:37 am Последнее редактирование: июня 14, 2015, 03:40:08 pm от admin
Доброе утро!

Загружаю файл Календарь.

Загружаю файл Продажи - S 01.2013. В данном файле указана суммы продаж по датам.

1. Загружаю как Кросс-таблицу. Выбираю встроенные метки и при загрузке даты становятся числовыми значениями -
01.01.2013 - 41275
02.01.2013 - 41276
03.01.2013 - 41277

2. Поле дата из файла Продаж не ассоциируется с датами из файла Календарь

Вопросы:
1. Как все таки загружать даты чтобы они оставались датами
2. Как добиться того, чтобы поле Дата одинаково ассоциировалось в обоих файлах

admin

февраля 17, 2015, 01:03:07 pm #1 Последнее редактирование: февраля 17, 2015, 01:06:17 pm от admin
Добрый день.

Когда мы загружаем данные из таблицы Excel, то грузятся не отображаемые данные (настроенные по формату ячейки) а подлинные значения. В случае с датами, загружаются числа либо текстовое представление числа, если Qlikview берет данные из заголовка, как в вашем случае.
Обычно, форматы полей при загрузке данных можно подкорректировать в операторе LOAD, предшествующем LOAD FROM.
Но в случае с матрицами этот вариант исключен, поэтому мы воспользуемся обработкой таблицы оператором Load Resident, в котором сначала преобразуем текст в число num#(Дата).
(О том, что поле Дата содержит текстовые данные можно узнать из обозревателя таблиц, наведя курсор на интересующее нас поле.)
Затем число преобразовываем в дату для нормального отображения, согласно установкам системы.
Получится скрипт:

tmp1:
CrossTable(Дата, Данные, 3)
LOAD Номенклатура.Код,
     Партнер.Код,
     ВидРеализации,
     [41275],
     [41276],
     [41277],
     [41278],
     [41279],
     [41280],
     [41281],
     [41282],
     [41283],
     [41284],
     [41285],
     [41286],
     [41287],
     [41288],
     [41289],
     [41290],
     [41291],
     [41292],
     [41293],
     [41294],
     [41295],
     [41296],
     [41297],
     [41298],
     [41299],
     [41300],
     [41301],
     [41302],
     [41303],
     [41304],
     [41305]
FROM
[S 01.2013 - копия.xlsx]
(ooxml, embedded labels, table is TDSheet);

Продажи:
NoConcatenate
load Номенклатура.Код,
     Партнер.Код,
     ВидРеализации,
     date(num#(Дата)) as [Дата],
     Данные
Resident tmp1;
DROP Table tmp1;


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



admin

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

LOAD date(Дата) As Дата,
     Месяц,
     Квартал,
     Год
FROM
[Календарь.xlsx]
(ooxml, embedded labels, table is Лист1);

mutniyglaz

С Календарем разобрался, но с Датами из файла Продажи, не получается... Скорее всего запутался в скрипте...

Мне надо загружать:
1. Таблица:

CrossTable(Дата, Данные, 3)
LOAD Номенклатура.Код,
     Партнер.Код,
     ВидРеализации,
     [41275],
     [41276], и т.д.

2. В этом же скрипте как продолжение:

Продажи:
NoConcatenate
load Номенклатура.Код,
     Партнер.Код,
     ВидРеализации,
     date(num#(Дата)) as [Дата],
     Данные

В данном скрипте что такое:

"Продажи:"
"Данные"

?

admin

Изначально, когда выполняется первый скрипт, преобразующий матрицу в обычную таблицу

tmp1:
CrossTable(Дата, Данные, 3)
LOAD Номенклатура.Код,
     Партнер.Код,
     ВидРеализации,
     [41275],
     [41276],
     [41277],
     [41278],
     [41279],
     [41280],
     [41281],
     [41282],
     [41283],
     [41284],
     [41285],
     [41286],
     [41287],
     [41288],
     [41289],
     [41290],
     [41291],
     [41292],
     [41293],
     [41294],
     [41295],
     [41296],
     [41297],
     [41298],
     [41299],
     [41300],
     [41301],
     [41302],
     [41303],
     [41304],
     [41305]
FROM
[S 01.2013 - копия.xlsx]
(ooxml, embedded labels, table is TDSheet);

Формируется таблица tmp1:
[smg id=74 width=700 type=preview]

mutniyglaz

Не могу понять куда подставлять скрипт, который будет определять дату

admin

февраля 17, 2015, 08:29:57 pm #6 Последнее редактирование: февраля 17, 2015, 08:33:11 pm от admin
Но так как нас не устраивает такой формат поля Дата, мы запускаем еще один запрос

Продажи:
NoConcatenate
load Номенклатура.Код,
     Партнер.Код,
     ВидРеализации,
     date(num#(Дата)) as [Дата],
     Данные
Resident tmp1;
DROP Table tmp1;

И получаем таблицу уже с нужным форматом поля Дата
[smg id=75 width=700 type=preview]
Т.е. очередность такая:
- грузим из Excel матрицу и преобразовываем в таблицу tmp1.
- формируем таблицу Продажи из tmp1, с преобразованием Дата в формат даты.
- Удаляем первую, промежуточную таблицу Tmp1.

mutniyglaz

Resident tmp1;
DROP Table tmp1;

я так понимаю эти команды тоже надо использовать?

admin

Приведу цитаты из документации.

ЦитироватьЗагрузка данных из ранее загруженной таблицы
Можно использовать логическое условие Resident в операторе LOAD, чтобы загрузить данные из ранее загруженной таблицы. Это удобно, когда необходимо выполнить вычисления с данными, загруженными с помощью оператора SELECT, когда нет возможности использовать функции Qlik Sense, такие как обработка даты или числовых значений.

Цитировать
Часто элемент Resident используется, при необходимости временной таблицы для выполнения вычислений или фильтра. Если временная таблица больше не нужна, избавьтесь от нее с помощью оператора Drop table.

Цитировать
Элемент Resident или предшествующий элемент LOAD?

В большинстве случаев тот же результат можно достичь с помощью предшествующего элемента LOAD. Это оператор LOAD, который выполняет загрузку из оператора LOAD или SELECT ниже, не указывая префикс источника, такой как From или Resident, который обычно указывается. Предшествующий элемент LOAD -- это обычно более быстрый способ, но есть случаи, когда необходимо использовать Resident LOAD:

    В случае необходимости использования утверждения Order_by для сортировки записей перед обработкой оператора LOAD.
    В случае необходимости использования одного из следующих префиксов. В этом случае предшествующий элемент LOAD не поддерживается:
        Crosstable
        Join
        Intervalmatch

Первоисточник

mutniyglaz

Спасибо, буду разбираться  :)

mutniyglaz

Ура, получилось!!!

Буду читать подробно документацию )

admin

Цитата: mutniyglaz от февраля 18, 2015, 10:05:30 am
Буду читать подробно документацию )

По загрузке данных рекомендую скачать в PDF-формате руководство
Загрузка и моделирование данных для Sense, но справедливо и для Qlikview (кроме источников lib)

mutniyglaz

С одной таблицей все получилось за (допустим) январь месяц.

Но я планирую загружать порядка 24 таблиц за 2 года.

Данную процедуру замены данных придется делать для каждой таблицы?

admin

А почему бы не взять данные сразу из базы?
Или сформировать отчет в табличном варианте и затем уже загружать.
Иначе, для каждого месяца потребуется править сценарий.

mutniyglaz

Цитата: admin от февраля 18, 2015, 01:27:22 pm
А почему бы не взять данные сразу из базы?


Из 1С?

Цитата: admin от февраля 18, 2015, 01:27:22 pm
Или сформировать отчет в табличном варианте и затем уже загружать.


Отчет в табличном варианте, но Дни продаж по столбцам идут...

Рейтинг@Mail.ru Яндекс.Метрика