Добрый день, коллеги.
Подскажите пожалуйста как добиться вот такого результата.
Причем преобразование необходимо провести на уровне скрипта.
(https://qliksense-forum.ru/qvf/proxy.php?request=http%3A%2F%2Fimage.prntscr.com%2Fimage%2Fc66811d765564442b250c7d2b1c1fd69.png&hash=9f018826d7df2bc06508480cdd779fc188f844fd)
Задача:
1. Имеем табличку, где сложены id товара и дата его наличия на складе.
2. id товара всегда уникальна
3. Если товар поступил на склад, то делается запись в таблице, если товар ушел со склада, то запись то же пропадает.
4. Нужно пронумеровать дни, 1 день, 2 день, и т.д. И если товар есть в наличии, то поставить 1, если нет записи то 0.
Спасибо, за помощь.
Привет.
Сделать очень просто.
Необходимо отсортировать по ID товара и дате, и пронумеровать записи.
Выражение примерно такое:
...
if(id=peek(id),День+1,1) as День,
...
Склад:
Load * inline
[
id,data
20,07.01.2016
14,01.01.2016
14,02.01.2016
14,03.01.2016
14,04.01.2016
14,05.01.2016
15,01.01.2016
15,02.01.2016
15,03.01.2016
15,04.01.2016
16,01.01.2016
16,02.01.2016
16,03.01.2016
20,06.01.2016
];
NoConcatenate
Склад_tmp:
LOAD
id,
data,
RowNo() as День
Resident Склад Order By id,data;
NoConcatenate
Склад_tmp_2:
LOAD
if(id=peek(id),День+1,1) as День
Resident Склад_tmp Order By id,data;
Drop Table Склад;
Вот, что получилось, но подсчет идет как-то не так. Подскажите пожалуйста, что делаю не так?
Можно сделать таким образом:
СкладTemp:
Load * inline
[
id,data
20,07.01.2016
14,01.01.2016
14,02.01.2016
14,03.01.2016
14,04.01.2016
14,05.01.2016
15,01.01.2016
15,02.01.2016
15,03.01.2016
15,04.01.2016
16,01.01.2016
16,02.01.2016
16,03.01.2016
20,06.01.2016
];
NoConcatenate
Склад:
LOAD
id as ID, //Field1
// data as DATA,
'День ' & Day(data) & ' (' & month(data) & year(data) & ')' as DAY, //Attribute
'1' as IN_STOCK //Value
Resident СкладTemp;
DROP TABLE СкладTemp;
temp1:
generic load * resident Склад;
result:
load distinct ID resident Склад;
drop table Склад;
FOR i = 0 to NoOfTables()
TableList:
LOAD TableName($(i)) as Tablename AUTOGENERATE 1
WHERE WildMatch(TableName($(i)), 'temp1.*');
NEXT i
FOR i = 1 to FieldValueCount('Tablename')
LET vTable = FieldValue('Tablename', $(i));
LEFT JOIN (result) LOAD * RESIDENT [$(vTable)];
DROP TABLE [$(vTable)];
NEXT i
DROP TABLE TableList;
В итоге получаем следующую таблицу:
(https://qliksense-forum.ru/qvf/proxy.php?request=http%3A%2F%2Fi12.pixs.ru%2Fstorage%2F9%2F6%2F8%2Fforumpng_6513000_24839968.png&hash=4d0b002e080324bd13d59418f082f6096b4c66ee) (http://pixs.ru/showimage/forumpng_6513000_24839968.png)
Prive, очень круто, то что нужно.
Подскажите пожалуйста, а как сделать, что бы для id 20 , сделать так что бы 06.01.16 было первым днем?
Так, как 06.01.16 товар только появился на складе и это его первый день нахождения на складе.
А то так получается, что он уже 6 дней находится на складе.
Цитата: tommix от 23 января 2017, 05:49:40
Prive, очень круто, то что нужно.
Подскажите пожалуйста, а как сделать, что бы для id 20 , сделать так что бы 06.01.16 было первым днем?
Так, как 06.01.16 товар только появился на складе и это его первый день нахождения на складе.
А то так получается, что он уже 6 дней находится на складе.
Можно сделать с помощью autonumber() :
СкладTemp:
Load * inline
[
id,data
20,07.01.2016
14,01.01.2016
14,02.01.2016
14,03.01.2016
14,04.01.2016
14,05.01.2016
15,01.01.2016
15,02.01.2016
15,03.01.2016
15,04.01.2016
16,01.01.2016
16,02.01.2016
16,03.01.2016
20,06.01.2016
];
//Сортируем по Товару и Дате + проставляем номер дня
Склад:
LOAD
id as ID,
data as DATA,
'День ' & AutoNumber(data,id) as День_номер,
'1' as IN_STOCK
Resident СкладTemp
Order by id,data;
DROP FIELD DATA;
DROP TABLE СкладTemp;
result:
load
distinct
ID
resident Склад;
temp1:
generic load * resident Склад;
drop table Склад;
FOR j = 0 to NoOfTables()
TableList:
LOAD TableName($(j)) as Tablename AUTOGENERATE 1
WHERE WildMatch(TableName($(j)), 'temp1.*');
NEXT j
FOR k = 1 to FieldValueCount('Tablename')
LET vTable = FieldValue('Tablename', $(k));
LEFT JOIN (result) LOAD * RESIDENT [$(vTable)];
DROP TABLE [$(vTable)];
NEXT k
DROP TABLE TableList;
(https://qliksense-forum.ru/qvf/proxy.php?request=http%3A%2F%2Fi12.pixs.ru%2Fstorage%2F0%2F4%2F9%2FScreenshot_5084866_24891049.png&hash=1dbcc6516bcf994a1a3020a6358aee1d31993acd) (http://pixs.ru/showimage/Screenshot_5084866_24891049.png)
ЦитироватьPrive
Можно сделать с помощью autonumber() :
То, что нужно.
Подскажи пожалуйста, как выйти на 7 дне из этого цикла, и дальше не считать.
Так как 99% остатков, как оказывается не лежат дольше 7 дней.
А вот 1% как оказывается может лежать более 2000 дней.
И в итоге вычисления в цикле, выполняются очень долго.
Цитата: tommix от 20 апреля 2017, 07:54:24
Подскажи пожалуйста, как выйти на 7 дне из этого цикла, и дальше не считать.
Можно заранее ограничиться количеством дней при загрузке таблицы Склад, условием Where AutoNumber(data,id) <= 7
Цитата: Prive от 22 апреля 2017, 06:40:45
Можно заранее ограничиться количеством дней при загрузке таблицы Склад, условием Where AutoNumber(data,id) <= 7
Да с этим, я разобрался. Все получилось. Но столкнулся с другой проблемой.
Prive, подскажи пожалуйста как можно разобраться со следующей ситуацией:
Товар сначала находился на складе 2 дня подряд, потом пропал на 1 день, А потом вернулся, т.е. в БД это выглядит следующим образом:
СкладTemp:
Load * inline
[
id,data
14,01.01.2016
14,02.01.2016
14,05.01.2016
т.е. 3,4 день товар отсутствовал.
Следовательно весь изложенный алгоритм считает так будто 05.01.2016 - это 3 день, и таким образом его записывает, а на самом деле это 5 день.
У меня был вариант, что на пропущенные даты, нужно сформировать дни с остатком 0, но как,то не особо получилось под каждый id товара сгенерировать дату с остатком = 0.
Не подскажешь, что можно сделать.
Коллеги, нужна помощь по этой задаче.
Сейчас, с оглядкой на эту подсказку - http://qlikview-forum.ru/qvf/index.php/topic,442.msg809.html#msg809 (http://qlikview-forum.ru/qvf/index.php/topic,442.msg809.html#msg809)
Пытаюсь на пропущенные даты сгенерировать строку с флагом = 0. т.е. пытаюсь сгенерировать отсутствующие дни.
Но в целом с тем алгоритмом, что выше, пока не удается сделать комплексно работающее решение.
Привет.
Скачай и подключи QVC.
В этой библиотеке есть функция, которая поможет.