intervalmatch + одновременно по номенклатурам

Автор Lister, 18 октября 2019, 02:49:25

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

Lister

Друзья, ситуация такая.

Таблица 1: Имеется таблица установки цен ТРЦ

Дата_установки   Номенклатура   ТРЦ   FromDate   ToDate
01.02.2019   Х20Н80 пруток   20   01.02.2019   01.03.2019
01.02.2019   29НК пруток   40   01.02.2019   01.03.2019
01.03.2019   Х20Н80 пруток   25   01.03.2019   01.04.2019
01.03.2019   29НК пруток   45   01.03.2019   01.04.2019
01.04.2019   Х20Н80 пруток   18   01.04.2019   01.05.2019
01.04.2019   29НК пруток   38   01.04.2019   01.05.2019
01.05.2019   Х20Н80 пруток   16   01.05.2019   01.08.2019
01.05.2019   29НК пруток   32   01.05.2019   01.09.2019
01.08.2019   Х20Н80 пруток   23   01.08.2019   01.03.2020
01.09.2019   29НК пруток   43   01.09.2019   01.03.2020

Таблица 2: Дата продаж

Дата_продажи   Номенклатура
12.02.2019   29НК пруток
02.03.2019   Х20Н80 пруток
04.03.2019   29НК пруток
16.04.2019   Х20Н80 пруток
23.04.2019   29НК пруток
28.04.2019   Х20Н80 пруток
17.05.2019   29НК пруток
20.05.2019   Х20Н80 пруток
10.07.2019   29НК пруток


При выполнении Intervalmatch получается кликвью находит дату продажу и ее интервал установки цен, но вопрос как сделать чтобы это было еще привязано к номенклатурам?

Получается такая ерунда

Дата_продажи   Номенклатура   ТРЦ
12.02.2019   29НК пруток   40
12.02.2019   29НК пруток   45
12.02.2019   29НК пруток   38
12.02.2019   29НК пруток   32
12.02.2019   29НК пруток   43
02.03.2019   Х20Н80 пруток   20
02.03.2019   Х20Н80 пруток   25
02.03.2019   Х20Н80 пруток   18
02.03.2019   Х20Н80 пруток   16
02.03.2019   Х20Н80 пруток   23
04.03.2019   29НК пруток   40
04.03.2019   29НК пруток   45
04.03.2019   29НК пруток   38
04.03.2019   29НК пруток   32
04.03.2019   29НК пруток   43
16.04.2019   Х20Н80 пруток   20
16.04.2019   Х20Н80 пруток   25
16.04.2019   Х20Н80 пруток   18




SET ThousandSep=' ';
SET DecimalSep=',';
SET MoneyThousandSep=' ';
SET MoneyDecimalSep=',';
SET MoneyFormat='# ##0,00 ₽;-# ##0,00 ₽';
SET TimeFormat='h:mm:ss';
SET DateFormat='DD.MM.YYYY';
SET TimestampFormat='DD.MM.YYYY h:mm:ss[.fff]';
SET FirstWeekDay=0;
SET BrokenWeeks=1;
SET ReferenceDay=0;
SET FirstMonthOfYear=1;
SET CollationLocale='ru-RU';
SET MonthNames='янв;фев;мар;апр;май;июн;июл;авг;сен;окт;ноя;дек';
SET LongMonthNames='Январь;Февраль;Март;Апрель;Май;Июнь;Июль;Август;Сентябрь;Октябрь;Ноябрь;Декабрь';
SET DayNames='Пн;Вт;Ср;Чт;Пт;Сб;Вс';
SET LongDayNames='понедельник;вторник;среда;четверг;пятница;суббота;воскресенье';


Let vBeginTime = Num('1.1.2013');
Let vEndTime = Num('1.3.2020');
Let vEpsilon = Pow(2,-27);

Перечень_ТРЦ:
load*inline [
Номенклатура, Дата_установки, ТРЦ
Х20Н80 пруток, 01.02.2019, 20
Х20Н80 пруток, 01.03.2019, 25
Х20Н80 пруток, 01.04.2019, 18
Х20Н80 пруток, 01.05.2019, 16
Х20Н80 пруток, 01.08.2019, 23
29НК пруток, 01.02.2019, 40
29НК пруток, 01.03.2019, 45
29НК пруток, 01.04.2019, 38
29НК пруток, 01.05.2019, 32
29НК пруток, 01.09.2019, 43
];


Tmp_Rates:
LOAD Номенклатура, ТРЦ,
Date(If(IsNum(Дата_установки), Дата_установки, $(#vBeginTime))) as FromDate
Resident Перечень_ТРЦ;
Rates:
LOAD Номенклатура, ТРЦ, FromDate,
Date(If( Номенклатура=Peek('Номенклатура'),peek(FromDate) - $(#vEpsilon),$(#vEndTime))) as ToDate
Resident Tmp_Rates
Order By Номенклатура, FromDate Desc;
Drop Table Tmp_Rates;


Продажи:
load*inline [
Номенклатура, Дата_продажи,
Х20Н80 пруток, 28.04.2019,
Х20Н80 пруток, 02.03.2019,
Х20Н80 пруток, 16.04.2019,
Х20Н80 пруток, 20.05.2019,
29НК пруток, 04.03.2019,
29НК пруток, 23.04.2019,
29НК пруток, 17.05.2019,
29НК пруток, 12.02.2019,
29НК пруток, 10.07.2019,
];

Inner join IntervalMatch ( Дата_продажи )

коннект:
LOAD FromDate, ToDate
Resident Rates;

Hugo

#1
Добрый день.
Ну в хелпе https://help.qlik.com/ru-RU/qlikview/April2019/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptPrefixes/IntervalMatch.htm ведь есть
ЦитироватьExample 2: (с помощью префикса keyfield)
Пример аналогичен приведенному выше, только в качестве ключевого поля добавляется ProductionLine .
Номенклатуру подтягивает
Inner join IntervalMatch ( Дата_продажи, Номенклатура )

//коннект:
LOAD FromDate, ToDate, Номенклатура
Resident Rates;
А вот как всё сделать красиво и правильно ещё и с ценами (это ведь главная задача?) - я бы тоже хотел увидеть решение от специалистов :)
Навскидку вижу что можно связать Rates и Продажи по ключу Номенклатура|FromDate|ToDate

Hugo

#2
Как вариант, проверял на Sense:
SET ThousandSep=' ';
SET DecimalSep=',';
SET MoneyThousandSep=' ';
SET MoneyDecimalSep=',';
SET MoneyFormat='# ##0,00 ₽;-# ##0,00 ₽';
SET TimeFormat='h:mm:ss';
SET DateFormat='DD.MM.YYYY';
SET TimestampFormat='DD.MM.YYYY h:mm:ss[.fff]';
SET FirstWeekDay=0;
SET BrokenWeeks=1;
SET ReferenceDay=0;
SET FirstMonthOfYear=1;
SET CollationLocale='ru-RU';
SET MonthNames='янв;фев;мар;апр;май;июн;июл;авг;сен;окт;ноя;дек';
SET LongMonthNames='Январь;Февраль;Март;Апрель;Май;Июнь;Июль;Август;Сентябрь;Октябрь;Ноябрь;Декабрь';
SET DayNames='Пн;Вт;Ср;Чт;Пт;Сб;Вс';
SET LongDayNames='понедельник;вторник;среда;четверг;пятница;суббота;воскресенье';


Let vBeginTime = Num('1.1.2013');
Let vEndTime = Num('1.3.2020');
Let vEpsilon = Pow(2,-27);

Перечень_ТРЦ:
load*inline [
Номенклатура, Дата_установки, ТРЦ
Х20Н80 пруток, 01.02.2019, 20
Х20Н80 пруток, 01.03.2019, 25
Х20Н80 пруток, 01.04.2019, 18
Х20Н80 пруток, 01.05.2019, 16
Х20Н80 пруток, 01.08.2019, 23
29НК пруток, 01.02.2019, 40
29НК пруток, 01.03.2019, 45
29НК пруток, 01.04.2019, 38
29НК пруток, 01.05.2019, 32
29НК пруток, 01.09.2019, 43
];


Tmp_Rates:
LOAD Номенклатура, ТРЦ,
Date(If(IsNum(Дата_установки), Дата_установки, $(#vBeginTime))) as FromDate
Resident Перечень_ТРЦ;

Rates:
LOAD Номенклатура, ТРЦ, FromDate,
Date(If( Номенклатура=Peek('Номенклатура'),peek(FromDate) - $(#vEpsilon),$(#vEndTime))) as ToDate
Resident Tmp_Rates
Order By Номенклатура, FromDate Desc;
Drop Table Tmp_Rates;

map_Rates:
mapping Load
Номенклатура&'|'&FromDate&'|'&ToDate, ТРЦ
Resident Rates;

Tmp_Продажи:
load*inline [
Номенклатура, Дата_продажи,
Х20Н80 пруток, 28.04.2019,
Х20Н80 пруток, 02.03.2019,
Х20Н80 пруток, 16.04.2019,
Х20Н80 пруток, 20.05.2019,
29НК пруток, 04.03.2019,
29НК пруток, 23.04.2019,
29НК пруток, 17.05.2019,
29НК пруток, 12.02.2019,
29НК пруток, 10.07.2019,
];

Inner join IntervalMatch ( Дата_продажи, Номенклатура )
LOAD FromDate, ToDate, Номенклатура
Resident Rates;

Продажи:
load
Номенклатура,
Дата_продажи as Продажи.Дата_продажи,
applymap('map_Rates', Номенклатура&'|'&FromDate&'|'&ToDate, null()) as Продажи.ТРЦ
Resident Tmp_Продажи;

 drop tables  Tmp_Продажи, Перечень_ТРЦ ;

Скрин результата:
http://prntscr.com/plx8i2

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