FAQ по скрипту Qlik Sense/Qlik View часть 2

Q: Необходимо выборку значений распределить в диаграмме по заранее неизвестным (расчетным) группам/кластерам.
Пример. Есть выборка значений от 1 до 100, в группе 1-10 количество значений 15, в группе 11-24 количество значений 35, в группе 25-33 количество значений 55 и т. д., т. е. необходим график похожий на нормальное распределение по количеству значений из выборки.
Как привязать расчетное количество из выборки к конкретному расчетному интервалу кластера значений?

A: Выражения вычисляются по измерениям, а в измерениях по какому критерию считать суммы?
Для этих целей следует использовать функцию aggr(), возвращающую массив значений, который уже будет входящим параметром для class().
Т.е. получится конструкция :
Код:
class(
aggr(
sum()… // выражения для расчета по измерениям указанным в следующей строк
,измерения для группировки в aggr()
,100)

Начните с простых выражений для построения измерений

Q: Как сделать диапазон даты, ну т.е. ДатаС и ДатаПо, которую я могу вводить вручную. И желательно чтобы вводилось в формате даты, а не в текстовом формате.
Вроде видел уже такую тему, но не смог найти еще раз.

A: Возможно подойдет данное решение: сначала вводим от и до (смотреть прикрепленный файл) и дальше код.
//LET v_Date_Min = 42736; // 01.01.2017
//LET v_Date_Max = 43100; // 31.12.2017

LET v_Date_Min_N = Num(v_Date_Min); // 01.01.2017
LET v_Date_Max_N = Num(v_Date_Max); // 31.12.2017

Dates:
LOAD $(v_Date_Min_N) as MinDateN,
$(v_Date_Max_N) as MaxDateN,
Date($(v_Date_Min_N), ‘DD.MM.YYYY’) as MinDate,
Date($(v_Date_Max_N), ‘DD.MM.YYYY’) as MaxDate
AutoGenerate(1);

FOR d = $(v_Date_Min_N) to $(v_Date_Max_N)
Period:
LOAD Date($(d), ‘DD.MM.YYYY’) as DAY,
‘W’ & Num(Week($(d)), 00) as WEEK,
Month($(d)) as MONTH,
Year($(d)) as YEAR
AutoGenerate(1);
NEXT d

Q: Как можно получить названия полей при экспорте с экселя, чтобы они стали уже значениями нового поля?
сводную таблицу хочу превратить в обычную.

A: CrossTable(Объект, Количество, 2)
LOAD * FROM
[Преобразование сводной таблицы.xlsx]
(ooxml, embedded labels, table is Лист2);

Q: Сталкивались ли вы в своей работе с проблемой того,что пользователь предоставляет данные в ексель файлах с разрозненными наименованиями полей,например городов или названия клиентов написанны в произвольной форме. Например один и тот же клиент может идти с полным названием,с сокращенным,с припиской ооо в начале, в конце, совсем без нее,с ошибками в названиях И так далее.Или есть адрес,откуда нужно забрать город,но адреса так же не унифицированны и написаны произвольно.Как можно справиться с такой проблемой,мэпринг получается очень большой и трудозатратный,так как в файлах тысячи строк,а функции subfield и другие строковые функции не получается примнгить из-за сильной неструктурированности полей?

A: Организацией порядка при вводе данных.

Q: Есть таблица: объект, артикул, дата, элементы товародвижения, остатки. Хочу удалить при первоначальном и при инкрементальном проходе нули остатков перед первым товародвижением.

При инкрементальном чуть больше код, а именно:
Код:
T8:
load *
,if(ARTICLE<>peek(‘ARTICLE’) and Flag=1,1,
if(ARTICLE<>peek(‘ARTICLE’) and TotalDailyRest<>0, 1,
if(ARTICLE<>peek(‘ARTICLE’) and Flag<>1, 0,
if(ARTICLE=peek(‘ARTICLE’) and TotalDailyRest<>0, 1,
if(ARTICLE=peek(‘ARTICLE’) and Peek(Flag) = 1,1,0))))) as Flag
Resident T7
order by OBJECT, ARTICLE, CREATEDAT
;

Т.е. при Flag = 0 в дальшейшем удалятся строки.

Проблема, что нельзя использовать ARTICLE<>peek(‘ARTICLE’) , т.к. не числа. Что можно взамен использовать? Артикулы как текст, вида 068770.

A: Стоп, почему нельзя использовать peek() с текстом?
Все прекрасно работает.

Следует учитывать сортировку и переходы по ключевым значениям верхнего уровня. В вашем примере это OBJECT.

Q:Хочу сделать обновление в зависимости от времени. Если обновляем в день создания текущего файла, или до 3х ночи следующего дня — то шаг обновления не делаем.

Не работает условие:
Код:
Let IH = 3;
Let DateLastData = date(FileTime(a)-MakeTime(IH));
If date(today(1)-MakeTime(IH)) > DateLastData then

У меня файл создан 28.02.2017 18:34, сейчас 01.03.2017 1:37, то есть по факту в условии будет 28.02.2017 > 28.02.2017, но почему то QS считает истиной.

A: Проводите сравнение в числовом формате.
Дата — это целая часть числа, а время — дробная.

Q: Подскажите, пожалуйста, можно ли «удалять» переменные скрипта после его выполнения (в частности те, что используются в «For each — Next»)- с тем, чтобы они не перегружали обозреватель переменных на втором уровне?
Спасибо!

A: Можно удалить макросом. Например:
Код:
sub test

ActiveDocument.RemoveVariable «v1»
end sub

Q: Столкнулась с проблемой и не знаю как решить.
Заранее извиняюсь, если решение есть на форуме и я не нашла его.

Есть данные из 1С вида:

ФИО Состояние СостояниеЗавершения ДатаПереходаНаСтатус
ФИО1 Отпуск Работает 23.05.2016
ФИО2 Увольнение 01.01.2001
ФИО3 Невыходы Работает 27.05.2016
ФИО4 Увольнение 01.01.2001
ФИО5 Отпуск Работает 31.05.2016
ФИО6 Работает 01.01.2001
ФИО7 Отпуск Работает 23.05.2016
ФИО8 Отпуск Работает 12.05.2016
ФИО9 Отпуск Работает 31.05.2016
ФИО10 Отпуск Работает 26.05.2016
ФИО11 Невыходы Работает 31.05.2016
ФИО12 Отпуск Работает 02.05.2016
ФИО13 Отпуск Работает 10.05.2016
ФИО14 Отпуск Работает 23.05.2016
ФИО15 Невыходы Работает 31.05.2016
ФИО16 Отпуск Работает 16.05.2016
ФИО17 Невыходы Работает 13.05.2016
ФИО18 Невыходы Работает 31.05.2016
ФИО19 Невыходы Работает 22.05.2016
ФИО20 Отпуск Работает 14.05.2016
ФИО21 Работает 01.01.2001
ФИО22 Работает 01.01.2001
ФИО23 Отпуск Работает 31.05.2016
ФИО24 Невыходы Работает 10.05.2016
ФИО25 Увольнение 01.01.2001

Сотрудники двигаются по статусам и надо подсчитать количество сотрудников по каждому статусу на период (Месяц).
С увольнением проблем нет, человек уволился и уволился, так же с прогулами, они нас интересуют конкретно за период.
Но в статусе работает нам нужны люди, которые находятся сейчас в статусе работают (делаю отбор статусов по последней дате у каждой конкретной ФИО) и которые ДО периода не меняли этот статус ни на какой другой.
Получается, выбирая период, мне нужно что бы подтягивались и данные до.
Вопрос как сделать.

A: Честно говоря, не совсем понятна исходная таблица.
ФИО повторяются? Перечислены все статусы?
Из какого источника формируется таблица? Из Отчета?

В 1С ЗУП данные о перемещениях и состояниях сотрудников хранятся в регистрах сведений.
Я бы рекомендовал использовать их для получения сведений.
Но можно решить задачу и на вашей таблице.
Можете подготовить контрольный пример на 1-2 ФИО?

Q: Есть поле провайдер с N-м числом значений. Надо создать группы из этих значений и включить их в список, чтобы в дальнейшим делать выборки по группам. Как это сделать?

A: Можно выгрузить в Excel, заполнить поле по группам и загрузить обратно.

Q: Как реализовать QlikView аналог SQL запроса работая с таблицами из QVD.
получаю данные в несколько QVD файлов.
Тут основной вопрос это как реализовать вложенный запрос для подсчета количества покупок в чеке???
Запрос:
Код:
Select
(SELECT
Count(*)
FROM
pos.order_client,
pos.wares_order
WHERE
order_client.code_order = wares_order.code_order AND
order_client.id_workplace = wares_order.id_workplace AND
order_client.code_shop = wares_order.code_shop) AS «Кол-во позиций»,
order_client.date_receipt AS «Дата чека (если чек не выбит)»,
order_client.number_receipt AS «Номер чека(если чек выбит)»,
order_client.date_order AS «Дата покупки»,
order_client.sum_order AS «Сумма чека»
pos.order_client.code_order AS «id_Код чека»,
order_client.code_client AS «ID_Код клиента»,
order_client.code_shop AS «ID_Код магазина»,
pos.order_client.id_workplace AS «ID_Код кассы»
FROM
pos.order_client;

A: Можно сделать так:

Код:
order_client:
LOAD
code_order,
id_workplace,
code_shop,
date_receipt,
number_receipt,
date_order,
sum_order,
code_client
FROM [order_client.qvd];

NoConcatenate
wares_order:
LOAD
code_order,
id_workplace,
code_shop,
RowNo() as номерСтроки
FROM [wares_order.qvd];

LEFT JOIN(order_client)
LOAD
code_order,
id_workplace,
code_shop,
Count(номерСтроки) as «Кол-во позиций»
Resident wares_order
Group by
code_order,
id_workplace,
code_shop;

DROP TABLE wares_order;

Q: Тяну данные из PostgreSQL, там поле типа «timestamp without time zone».
Нужно получить название месяцев, что бы они сортировались не по алфавиту, а по календарю. то есть просто заменить кейсом на на названия — не вариант.
Пробую так:
Код:
Month(order_client.date_order) As «Месяц»,
Получаю ошибку: ErrorMsg: ERROR: function month(timestamp without time zone) does not exist;
Кто сталкивался и как исправить?
Вот пробую так (подсовываю отформатированую дату):
Код:
Month(date#(order_client.date_order, ‘DD.MM.YYYY’)) As «Месяц»
Но в итоге все равно ошибка (он почему то функцию принимает за название поля):
SQL##f — SqlState: 42703, ErrorCode: 7, ErrorMsg: ERROR: column «date» does not exist;
Error while executing the query

A: Дату возьмите, и с ней уже будете работать средствами клика.

Q: Т.е я разобрался в примере из документации.
Но в контексте данного кода не могу разобраться — Что именно она делает? :
Код: [Выделить]
tmp1:
LOAD min(Date(Date#(dt,’YYYYMMDD’))) as ‘DateStart’, max(Date(Date#(dt,’YYYYMMDD’))) as ‘DateEnd’ Resident GOODS_MOVEMENT;

LET Date_Start = peek(‘DateStart’,0,’tmp1′);
LET Date_End = peek(‘DateEnd’,0,’tmp1′);
LET vStart = floor(Date_Start);
LET vEnd = floor(Date_End);
LET vNumOfDays = vEnd — vStart + 1;
//DROP Table tmp1;

A: Согласно описанию и своему предназначению peek(‘DateStart’,0,’tmp1′) возвращает значение переменной DateStart из первой строки/записи ( 0 обозначает первую запись) таблицы с именем tmp1.

Q: Подскажите пожалуйста,каким образом можно вывести поля YearMonth,YearQuarter ?

CalendarD:
Load

Код:
As PeriodD
,[MonthCode] As MonthD
,[MonthName] as MonthNamesD
,[Year] as [YearD]
,Quarter as QuarterD
;
SQL SELECT *

Поле [code] as PeriodD имеет следующий вид (рис_1)
Пробовал выводить нужные мне поля методом: date(monthstart(Code), ‘MMM YYYY’) as MonthYearD
…но он явно не подходит.

A: http://qlikview-forum.ru/qvf/index.php/topic,11.0.html

Q: Есть столбец, где хранятся номера, нужно на уровне загрузочного скрипта, к этой таблице прикрепить текст.

Пример:
122121 -> МСК122121

Ни как не могу найти функцию, которая бы помогла данную задачу решить.

A: МСК’&ПолеТаблицы as НовоеПоле

Q: Проблема следующая:
Есть несколько однотипных файлов, разложенных по разным подпапкам в одной папке.
Есть ли возможность Загружать в qlikview все эти файлы одним оператором LOAD и при этом ещё записывать в отдельное поле имя подпапки, откуда загружен каждый файл?

A: Скачайте QVC и посмотрите функцию dodir() вроде бы, + там много интересных функций.
https://github.com/RobWunderlich/Qlikview-Components

Q: Есть ассортимент из 5 товаров (SKU) и база клиентов 3 магазина. Каждый из магазинов в определенный временной период закупает определенный ассортимент SKU определенного количества.
Требуется рассчитать Общую проданную дистрибуцию за отчетный период (день/месяц/квартал/год/любой указанный период).

Пример,
Магазин 1 закупил 5 SKU Первая накладная — 3 SKU, вторая накладная — 3 SKU (два новых и одно из прошлой накладной.
Магазин 2 закупил 4 SKU Первая накладная — 2 SKU, вторая накладная — 2 SKU. Все купленные SKU уникальные.
Магазин 3 закупил 1 SKU Первая накладная — 1 SKU, вторая накладная — 1 SKU. SKU одинаковые.

Общая проданная дистрибуция за период равна Проданная дистрибуция Магазин 1 + Проданная дистрибуция Магазин 2 + проданная дистрибуция Магазин 3 =5+4+1= 10 SKU.

Задача сводится к подсчету уникальных SKU по всем накладным клиентов в отчетный период и суммированию уникальных купленных SKU по всем клиентам.

A: Код:
sum(
aggr(count(distinct SKU), Магазин )
)
Чтобы было проще обсуждать проблему и находить решение желательно выкладывать образец данных.
В любом табличном формате — csv, xls* или фрагмент скрипта загрузки load inline …

Q: Как реализовать инкрементальную загрузку для таблицы транзакций из SQL базы?

Исходные данные:
В базе данных есть таблица транзакций с полями:
№, Дата, Сумма
1 01.04.2016 08:05:47 500
2 03.04.2016 10:09:12 350
….
235 12.10.2016 15:05:21 740

Задача:
Создать скрипт загрузки в QlikView, который позволить загружать из базы данных только новые данные (данные с последней успешной загрузки), а остальные — из qvd-файла.

A: если дата из вашего источника однозначно определяет новую запись или измененную, то можете опираться на нее.
Значения $(LastExecTime) и $(BeginningThisExecTime) берете из существующего Qvd и скрипта.

Найти решение у бизнес-партнера QlikTech (QlikView) в России.

Форум разработчиков QlikView и Qlik Sense. Получите ответы на все вопросы по QlikView и Qlik Sense!

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий

64 queries in 0,205 seconds
Website nonton bokep jepang