Q: Ребят подскажите, при перезагрузки скрипта бывает попадают файлы которые были ранее уже загружены и данные из них сохранены в qvd соответственно происходит дублирование значений. Как можно исключить добавления данных из ранее обработанных файлов? имена файлов уникальны.
A:Так то, distinct исключает дубли, но я бы рекомендовал сравнение по уникальному ключу через exist() при загрузке.
Q: Нужно получить время создания определенного файла qvd.
Код:
let vFileName=’C:\ProgramData\QlikTech\Documents\ЗаказПокупателейРХ.qvd’;
ДатаФайловЗагрузки:
load
FILETIME (‘$(vFileName)’) as ОбновлениеРХ;
При загрузке – ничего не происходит. Файл ЗаказПокупателейРХ.qvd есть
A: Filetime с параметром следует использовать для присвоения значения переменной, например:
Код:
let vTest=filetime(‘c:\test\test.7z’);
Без параметра функция используется для получения времени табличного файла, загружаемого в текущем Load. В этом случае значение будет в поле таблицы, для каждой записи.
Q: я голову сломал, форум прошерстил, не могу понять, как сделать простую вещь:
abon:
Load * Inline
[
Абонент, Подключился, Отключился
1, 01.01.2010, 01.02.2010
2, 01.01.2010, 01.03.2010
3, 01.01.2010, 01.03.2010
4, 01.02.2010, 01.03.2010
5, 01.02.2010, 01.04.2010
6, 01.02.2010, 01.05.2010
7, 01.02.2010,
8, 01.03.2010, 01.04.2010
9, 01.03.2010, 01.04.2010
10, 01.03.2010, 01.05.2010
11, 01.03.2010, 01.05.2010
12, 01.03.2010,
13, 01.04.2010,
14, 01.05.2010,
];
То есть у нас абоненты подключаются и отключаются, некоторые еще не отключились. Я могу вывести таблицу подключений и таблицу отключений, но как сделать таблицу общего притока/оттока по датам? То есть мне нужен приток-отток на дату.
Так как даты в разных колонках, общую агрегацию не сделать и даже, если использовать прегенерированный календарь, то все равно надо связать его с одной из двух колонок.
A: Посмотрите в хелпе информацию по intervalmatch().
Q: Имею таблицу базы данных, состоящую. например, из 2 столбцов:
1. Наименование
2. Статус.
Статус может принимать значение «актуальная» и «аннулирована».
Как загрузить только записи, имеющие статус «актуальная»?
пробовала в операторе Load использовать конструкцию Where Статус=’актуальная’, не работает….
A: в вашем случае
where wildmatch( [Статус], ‘актуальная’)

Q: Анализирую БД моей системы Service Desk и есть необходимость подсчитать время жизни заявки в днях-часах-минутах. Все вроде хорошо считалось через
interval(конечная дата — начальная дата)
но внезапно обнаружил, что если заявка переходит через год то ее возраст вместо 23 дней становится более 350.
Есть идеи как подсчитать возраст заявки чтобы результат получатся в формате DD hh:mm:ss ?
A: Вроде нормально все считает.
Код:
Interval(F2-F1, ‘DD hh:mm:ss’ )
Q: Опять нужен Ваш совет:
Есть таблица сохраненная в QVD файл, формируется с помощью инкрементальной загрузки, на каждый месяц, далее все это загружается в рабочую таблицу (данных очень много >1000000 обработанных файлов) необходимо удалять некорректные данные по списку допустим по полю «№» без перезагрузке всех данных.
в идеале создать таблицу xls и из нее взять нужные номера и удалить эти данные.
A: Можно создать таблицу с требуемыми исключениями и при загрузке проверять на существование exists() в ней.
Q: Задался другим интересным вопросом. А можно ли аддитивно складывать данные в один файл QVD? Есть ли аналог операции INSERT INTO в QlikView? Может есть параметр, который позволяет добавлять строчки в уже существующий файл QVD?
A: Ну как бы это не проблема, смотрим про инкрементальную загрузку.
Все через память, но это даже удобно становится.
таблица:
Load таблица1
concatenate Load ТакаяЖеКакТаблица1
store * from таблица into таблица1
Я наоборот, разделяю свои данные по годам.
Q: Возникла такая задача необходимо связать 2 таблицы по номеру телефона.
1 таблице тяну информацию по контакту из второй тяну информацию по продажам. Единственная возможность сделать связь только по номеру телефона (номера по клиентам точно соответствую как в заявке и в таблице продаж и не могут быть разными), но есть проблема с форматом ввода номера, 🙂 каждый записывает его кто как хочет и в разных таблицах он записан по разному, и получается нечто такое:
Phone
+75555555555
+7-555-555-55-55
7-555-555-55-55
85555555555
и т.д.
Как лучше сделать выборку данных по номерам привести их к одному виду и связать их между собой ключем (как вариант по последним 7 символам)?
A: Самое простое из приведенного вами списка
right ( replace(поле_номера_телефона,’-‘,») , 7 ) as НомерТелефона
Q: Только начинаю осваивать QLIKVIEW столкнулся с такой проблемой. Загружаю данные в QV из файла EXCEL. В одной колонке данные вида nms:1/2/3. Информативно для меня только первое числовое значение перед /, т.е. 1 в приведенном примере. Как заставить QV загружать только эти данные из конкретной колонки?
A: Если указанный формат значения справедлив для всех записей, то можно использовать функцию
TextBetween(s , beforetext , aftertext [, n ])
примерно так:
Код:
TextBetWeen(Поле,’nms:’,’/’)

Q: Я новичек. Изучаю Qlik Sense.
Искала ответ на свой вопрос в руководствах по Qlik, но либо не все понимаю, либо это невозможно сделать.
Прошу помочь, кто знает.
Задача такая:
Есть загруженные базы
Продаж
Orders:
LOAD
ID_Order,
ID_Sellers,
[Date],
ID_Product,
Product_count,
Product_sum
FROM ……….( table is Orders);
ID_Order ID_Sellers Date ID_Product Product_count Product_sum
1884 CB0000006 13.02.16 CB000000131 1.00 140 000,00
1884 CB0000006 13.02.16 CB000000332 1.00 220 000,00
1876 CB0000006 13.02.16 CB000000639 1.00 110 000,00
1876 CB0000006 13.02.16 CB000000640 1.00 110 000,00
1876 CB0000006 13.02.16 CB000002362 1.00 110 000,00
1876 CB0000006 13.02.16 CB000002365 1.00 110 000,00
1876 CB0000006 13.02.16 CB000002366 1.00 110 000,00
1876 CB0000006 13.02.16 CB000002368 1.00 110 000,00
1876 CB0000006 13.02.16 CB000002369 1.00 110 000,00
1876 CB0000006 13.02.16 CB000002529 1.00 110 000,00
1876 CB0000006 13.02.16 CB000002531 1.00 110 000,00
1882 CB0000007 13.02.16 CB000000754 1.00 110 000,00
1878 CB0000007 13.02.16 CB000002455 1.00 140 000,00
1877 CB0000007 13.02.16 CB000002589 1.00 20 000,00
1882 CB0000007 13.02.16 CB000002842 1.00 120 000,00
1911 CB0000006 15.02.16 CB000001661 2.00 270 000,00
1910 CB0000006 15.02.16 CB000002387 1.00 140 000,00
1910 CB0000006 15.02.16 CB000002768 1.00 120 000,00
1919 CB0000007 16.02.16 CB000000646 1.00 110 000,00
1916 CB0000007 16.02.16 CB000002089 1.00 110 000,00
1916 CB0000007 16.02.16 CB000002104 1.00 110 000,00
1916 CB0000007 16.02.16 CB000002644 2.00 180 000,00
1922 CB0000006 17.02.16 CB000000374 1.00 220 000,00
1926 CB0000006 17.02.16 CB000000586 1.00 220 000,00
1925 CB0000006 17.02.16 CB000002678 1.00 270 000,00
1925 CB0000006 17.02.16 CB000002836 1.00 120 000,00
1930 CB0000007 17.02.16 CB000000595 1.00 220 000,00
1928 CB0000007 17.02.16 CB000002166 1.00 140 000,00
1930 CB0000007 17.02.16 CB000002336 1.00 140 000,00
1930 CB0000007 17.02.16 CB000002838 1.00 120 000,00
и не связная база
Бонусов(справочник)
ProductSet:
LOAD ID_ProductSet,
ProductSet_Count,
Pr_SetBonus
FROM………… (table is ProductSet);
ID_ProductSet ProductSet_Count Pr_SetBonus
1 1 500
2 2 1 500
3 3 2 500
4 4 3 500
5 5 5 000
6 6 5 000
7 7 5 000
Каждому ID_Order по соответствующему ID_Sellers и Date может соответствовать от 1 и более ID_Product
нужно создать отдельную не связную новую таблицу ХХХ:, которую потом связать с ProductSet:
В таблице ХХХ: должны остаться те же поля из Orders: ID_Order, ID_Sellers, Date, (схлопнутые Discinct).
Поля: Product_sum меняется на Or_sum и суммирует Product_sum ,
Product_ count меняется на Or_count и суммирует Product_ count ,
Вместо ID_Product появится новое поле ID_ProductSet (через которое потом связываться) подсчитывает ID_Product строки
В итоге должна получится такая табл.
ID_Order ID_Sellers Date ID_ProductSet Or_count Or_sum
1884 CB0000006 13.02.16 2 2 360 000,00
1876 CB0000006 13.02.16 9 9 990 000,00
1882 CB0000007 13.02.16 2 2 330 000,00
1878 CB0000007 13.02.16 1 1 140 000,00
1877 CB0000007 13.02.16 1 1 20 000,00
1911 CB0000006 15.02.16 1 2 270 000,00
1910 CB0000006 15.02.16 2 2 260 000,00
1919 CB0000007 16.02.16 1 1 110 000,00
1916 CB0000007 16.02.16 3 4 400 000,00
1922 CB0000006 17.02.16 1 1 220 000,00
1926 CB0000006 17.02.16 1 1 220 000,00
1925 CB0000006 17.02.16 2 2 390 000,00
1930 CB0000007 17.02.16 3 3 480 000,00
1928 CB0000007 17.02.16 1 1 140 000,00
Почему именно нужна такая таблица. По полю ID_ProductSet потом нужно соединить (Concatenate) таблицу ProductSet: и получить
ID_Order ID_Sellers Date ID_ProductSet Or_count Or_sum Pr_SetBonus
1884 CB0000006 13.02.16 2 2 360 000,00 1000
1876 CB0000006 13.02.16 9 9 990 000,00 2500
1882 CB0000007 13.02.16 2 2 330 000,00 1000
1878 CB0000007 13.02.16 1 1 140 000,00 500
1877 CB0000007 13.02.16 1 1 20 000,00 500
1911 CB0000006 15.02.16 1 2 270 000,00 500
1910 CB0000006 15.02.16 2 2 260 000,00 1000
1919 CB0000007 16.02.16 1 1 110 000,00 500
1916 CB0000007 16.02.16 3 4 400 000,00 1500
1922 CB0000006 17.02.16 1 1 220 000,00 500
1926 CB0000006 17.02.16 1 1 220 000,00 500
1925 CB0000006 17.02.16 2 2 390 000,00 1000
1930 CB0000007 17.02.16 3 3 480 000,00 1500
1928 CB0000007 17.02.16 1 1 140 000,00 500
После, по полученной таблице уже строить аналитический график.
Если кто-то что-нибудь посоветует, буду очень признательна.
A: Код:
sum(Product_sum) as Or_count,
sum(Product_count) as Or_count,
а
Код:
sum(Product_sum) as Or_Sum,
sum(Product_count) as Or_count,
Q: Второй день бьюсь с проблемой при загрузке данных.
Имеется подобный скрипт.
Проблема в последней строке — не работает!
Возможно я пошел не тем путем, но все же — может у кого есть идея?
Level1:
LOAD GR_ID as GR_ID1,
GR_NAME, P_GR_ID
Resident
Level
Where P_GR_ID=0;
Level2:
LOAD GR_ID as GR_ID2,
GR_NAME, P_GR_ID
Resident
Level
WHERE
match (P_GR_ID, SELECT GR_ID1 FROM Level1);
A: Описание функции Match в справке может помочь найти правильное решение.
Q: подскажите возможно ли в QlikView искать определенное слово в ячейке и при нахождение записывать результат в другую ячейку.
Например из ячейки А(Янтарный замок) найти слово замок и записать в ячейку Б(Замки)
A: Вариантов решения задачи может быть несколько.
Вот самый простой, с условностями.
Код:
maptable:
Mapping LOAD * INLINE [
F1,F2
баннеров, Баннер
баннера, Баннер
плакатов, Плакат
];
table1:
load * Where not Match([Б], ‘NoKeyWord’);
LOAD *,ApplyMap(‘maptable’,SubField([А],’ ‘),’NoKeyWord’) as [Б] INLINE [
А
Закупка баннеров
Приобретение баннера
закупка плакатов
];
Q: Столкнулся со следующей проблемой: собираю уникальные (distinct) значения даты-времени (timestamp) из разных источников в одну таблицу с полями «host» и «event_date». Затем привожу ее к виду «host», «event_date_from», «event_date_to» следующим скриптом:
Код:
LOAD
host_name,
event_date_from,
event_date_to,
Interval(event_date_to-event_date_from,’hh:mm:ss’) as event_duration;
LOAD
host,
Timestamp(event_date) as event_date_from,
Timestamp(If(Previous(host)=host,Previousevent_date)-(1/86400),’$(vNow)’)) as event_date_to
Resident events
Order By host, event_date desc;
Т.е. в отсортированной по дате (по убыванию) таблице, для каждого события, в качестве event_date_to беру предыдущий event_date и вычитаю из него секунду. Для самого последнего события event_date_to равняется текущему времени.[/code]
Так вот, не смотря на то, что беру уникальные значение по Timestamp (SET TimestampFormat=’DD.MM.YYYY hh:mm:ss’), закрадываются такие значения, которые в числовом представлении отличаются на миллисекунды, а timestamp у них одинаковый. Из-за чего, после преобразования точность event_duration равна миллисекундам, т.е. есть значения менее секунды или между секундами. Из-за этого, в свою очередь, появляются одинаковые event_duration в формате ‘hh:mm:ss’, однако разные в номерном представлении.
Откуда берутся миллисекунды? Я уже пытался все округлять до секунд путем
Код:
LOAD
host_name,
Timestamp(Floor(event_date_from*86400)/86400) as event_date_from,
Timestamp(Floor(event_date_to*86400)/86400) as event_date_to;
Не помогает.
A: Привет, время время может хранится числом секунд, миллисекунд , наносекунд.
Выясните как хранится время в источнике, какое число соответствует какой дате.
И если оно не в секундах, то потребуется избавиться от лишних мгновений, разделить на 10 в какой-нибудь степени и дальше работать с округленным, целым числом
Q: Есть две расчитанных таблицы из загруженных данных:
1) Ключ|ЗначениеX|Вычисление1.1|Вычисление1.2|ИтогТабл1
2) Ключ|ЗначениеX|Вычисление2.1|Вычисление2.2|ИтогТабл2
Существует ли возможность объединить их и получить обощеную таблицу вида:
Ключ|ИтогТабл1|ИтогТабл2
A: Привет, конечно же возможно.
Почитайте про Join
http://help.qlik.com/ru-RU/qlikview/12.0/Subsystems/Client/Content/combine-tables-with-join-keep.htm
http://help.qlik.com/ru-RU/qlikview/12.0/search/?q=join
Q: Через R сделал небольшой пример по ассоциативным правилам.Получил результат (screen_7).Подскажите пожалуйста,каким образом можно применить строковые функции,чтобы раздробить столбец Rules на 2 столбца(screen_8).
A: Можете воспользоваться функцией Subfield() .
Пример:
SET vTest = ‘»1″,»{2} => {7}»,0.125,1,2.66666667′;
SET vStr = SubField(vTest ,’,’,2)
(переменная vStr в данном случае будет равна «{2} => {7}»)
Выдержка из руководства:
subfield(s, ‘delimiter’ [ , index ] )
В этой версии с тремя параметрами данная функция скрипта возвращает определенную подстроку
большей строки s с разделителем «delimiter». index — дополнительное целое число, обозначающее
подстроку, которая должна быть возвращена. Если index отсутствует, при использовании subfield в
выражении поля в операторе load функция subfield укажет оператору load на автоматическое создание
одной полной записи для каждой подстроки в s.
В версии с двумя параметрами функция subfield создает одну запись для каждой подстроки, которая
может быть получена для строки s большего размера с разделителем «delimiter». При использовании
нескольких функций subfield в одном операторе load будет получено декартово произведение всех
сочетаний.
Примеры:
(для трех параметров)
subfield(S, ‘;’ ,2) возвращает ‘cde’, если S — ‘abc;cde;efg’
subfield(S, ‘;’ ,1) возвращает NULL, если S — пустая строка
subfield(S, ‘;’ ,1) возвращает пустую строк, если S — ‘;’
Q: У меня есть таблица с двумя полями:
1. Номер заказа
2. Время оформления (в формате чч:мин)
Вопрос — как мне рассчитать в какие интервалы времени больше всего заказов. Или сделать интервалы часовые и посмотреть кол-во заказов каждый час в течение 24 часов?
Нужно ли включать это время в календарь и как?
A: Либо, если время задано текстом, просто выделить часовую составляющую 02:30 = 02.
Для облегчения восприятия можно задать интервалы, например 02:30 = «с 2 до 3» и используя таблицы сопоставления создать новое измерение.
Календарь в этом случае менять не требуется.

Найти решение у бизнес-партнера QlikTech (QlikView) в России.
Форум разработчиков QlikView и Qlik Sense. Получите ответы на все вопросы по QlikView и Qlik Sense!
RSS
4 декабря 2017
gromych 
Опубликовано в рубрике