Сумма продаж на дату с начала года (Qlikview, Qlik Sense)

Автор ienjou, 09 апреля 2017, 01:03:02

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

ienjou

Добрый день, коллеги!
Я новичок в освоении qlik, завалился кучей информации и не много "поплыл".
Не могу разобраться, как мне кажется, с элементарным вопросом.
Извиняюсь, если данная тема была на форуме, я не нашел решения.

Как посчитать сумму продаж на определенную дату с начала года?
Насколько я понимаю, нужно использовать функцию InYearToDate.
Кажется, конструкция выглядит так :  sum(if (InYearToDate (OrderDate, BaseDate, 0), TotalSales)), но я не совсем понял что вписать вместо BaseDate... какую дату? нужна ли переменная ?

Заранее спасибо!

Andrey S

#1
День добрый!

Хорошо бы увидеть модель данных, -  в частности интересует, как устроен календарь.
Полагаю, что в любом случае лучше будет использовать Set Analysis.
Рекомендую почитать статейку о том, как можно  выстраивать и использовать время в модели. Вложил.

Также, подход к решению задачи будет зависеть от того, какой конкретный отчет требуется получить.
На вкладке "Выражения" свойств диаграмы есть опция рассчитывать выражение накопительно. В ряде случаев этого может быть вполне достаточно.

ienjou

Спасибо за информацию! Ознакомлюсь!

Ниже скрипт календаря :

// Определение дат начала и окончания диапазона
TempMinMaxDates:
LOAD   
       Min(OrderDate) as MinDate,
       Max(OrderDate) as MaxDate
RESIDENT Orders;

LET varMinDate = Num(FieldValue('MinDate', 1));
LET varMaxDate = Num(FieldValue('MaxDate', 1));

Drop Table TempMinMaxDates;

// Формирование последовательности дат в диапазоне
TempCalendar:
LOAD
       date ($(varMinDate) + rowno() - 1)      as TempDate
AUTOGENERATE $(varMaxDate) - $(varMinDate) + 1;

// Формирование календаря с иерархией периодов
Calendar:
LOAD         
       [TempDate] as OrderDate,
       Day([TempDate]) as [День],
       Week([TempDate]) as [Неделя],
       WeekName([TempDate]) as [НеделяГод],
       WeekDay([TempDate]) as [День Недели],
       Month([TempDate]) as [Месяц],
       MonthName([TempDate]) as [МесяцГод],
       Dual('КВ'&Text(Div(Month([TempDate]),4)+1),Div(Month([TempDate]),4)+1)    as [Квартал],
       QuarterName([TempDate]) as [КварталГод],
       Year([TempDate]) as [Год]
       

       

Resident TempCalendar ORDER By TempDate ASC;


DROP Table TempCalendar;

Prive

В вложении файл qvw, продажи подсчитаны в чарте с начала года, используя функцию InYearToDate  + с помощью Set Analysis. Способ с if-ами не самый удачный. (в плане скорости работы)
Покажите на данном файле , что Вам необходимо получить в итоге.

ienjou

#4
Спасибо!
Но - если эта дата не "today", а дата из истории - к примеру мне нужно сравнить продажи с начала  года на дату 01.06.2007, для дальнейшего сравнения с другими периодами.

Вроде получилось :
Sum({<Год=, Месяц=, Квартал=, Неделя=, День=, DateNum={">=$(=Num(YearStart(Max(DateNum))))<=$(=Max(DateNum))"}>} Price   )
Поправьте, если что то сделано неверно.





Prive

Цитата: ienjou от 10 апреля  2017, 05:08:13  
...
Вроде получилось :
Sum({<Год=, Месяц=, Квартал=, Неделя=, День=, DateNum={">=$(=Num(YearStart(Max(DateNum))))<=$(=Max(DateNum))"}>} Price   )
Поправьте, если что то сделано неверно.
А как пользователь будет выбирать DateNum?  Или есть ещё связанные поля с DateNum? (МесяцГод и т.д.)
Можете также использовать альтернативные состояния для решения данной задачи.
http://help.qlik.com/ru-RU/qlikview/12.1/Subsystems/Client/Content/Alternate%20States.htm
Т.е. Вы создадите аналогичные фильтры по датам, но выберете в настройках иное альтернативное состояние(например, "alt1"). Далее в экспрешене будете его использовать : Sum({alt1}...Price)

ienjou

Да, при выборе Orderdate все становится печально.
Я пришел к выводу что нужно делать флаги в скрипте загрузки для YTD и LYTD.
Осталось разобраться как верно это сделать :)

admin

Привет,
фрагмент в помощь:

if(InYear(date(DateId), '$(vQueryTime)', 0),1,0) as Cal_Full_TY,
if(InYearToDate (date(DateId), '$(vQueryTime)', 0),1,0) as Cal_YTD_TY,
if(InYearToDate (date(DateId), '$(vQueryTime)', -1),1,0) as Cal_YTD_LY,
if(InMonth (date(DateId), '$(vQueryTime)', 0),1,0) as Cal_MTD_TY,
if(InMonth (date(DateId), '$(vQueryTime)', -12),1,0) as Cal_MTD_LY,
if(num(weekday(DateId))=6,1,0) as EOW_Flag,
if(num(weekday(DateId))=0,1,0) as BOW_Flag,
if(num(DateId)=num(floor(monthend(DateId))),1,0) as EOM_Flag,
if(num(DateId)=num(floor(monthstart(DateId))),1,0) as BOM_Flag,
if(num(DateId)=num(floor(QuarterStart(DateId))),1,0) as BOQ_Flag,
if(num(DateId)=num(floor(QuarterEnd(DateId))),1,0) as EOQ_Flag

ienjou

#8
Коллеги, я использую Qlik sense - примерно неделю, проще застрелиться, чем освоить столько новой информации :)
Добавил в календарь
if(InYear(date(TempDate), '$(vQueryTime)', 0),1,0) as Cal_Full_TY,
if(InYearToDate (date(TempDate), '$(vQueryTime)', 0),1,0) as Cal_YTD_TY,
if(InYearToDate (date(TempDate), '$(vQueryTime)', -1),1,0) as Cal_YTD_LY

Пытаюсь посчитать  Sum( {$<Cal_Full_TY={1}>} Price ) Но безуспешно.
Ушел разбираться как использовать флаги в выражениях...

admin

Для начала проверьте наличие флага в календаре и корректность его значений.

ienjou

Коллеги,
Флаги вроде на месте. При создании фильтра по ним, выдают 0 или 1, и считают конечную сумму за год (YTD) или предыдущий год (LYTD) полностью, но при выборе любой даты поля OrderDate, выдают либо 0 либо сумму продаж за один день, а по заданию требуется сумма продаж c начала года по выбранную дату, для дальнейшего сравнения периодов и вывода результата в KPI.
Код календаря по флагам, использовал и предложенный Вами выше, результат не корректный...
               inyeartodate(TempDate, $(varMaxDate), 0) * -1 AS CurYTDFlag,
               inyeartodate(TempDate, $(varMaxDate), -1) * -1 AS LastYTDFlag,
Выражение - Sum( {$<CurYTDFlag={1}>} Price)
Я в смятении :(


Prive

Сможете выложить пример?  Так тяжело разбираться, не видя скрипта, модели данных.

ienjou

Все получилось через использование правильных переменных!
Спасибо!

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