Добрый день, коллеги!
Я новичок в освоении qlik, завалился кучей информации и не много "поплыл".
Не могу разобраться, как мне кажется, с элементарным вопросом.
Извиняюсь, если данная тема была на форуме, я не нашел решения.
Как посчитать сумму продаж на определенную дату с начала года?
Насколько я понимаю, нужно использовать функцию InYearToDate.
Кажется, конструкция выглядит так : sum(if (InYearToDate (OrderDate, BaseDate, 0), TotalSales)), но я не совсем понял что вписать вместо BaseDate... какую дату? нужна ли переменная ?
Заранее спасибо!
День добрый!
Хорошо бы увидеть модель данных, - в частности интересует, как устроен календарь.
Полагаю, что в любом случае лучше будет использовать Set Analysis.
Рекомендую почитать статейку о том, как можно выстраивать и использовать время в модели. Вложил.
Также, подход к решению задачи будет зависеть от того, какой конкретный отчет требуется получить.
На вкладке "Выражения" свойств диаграмы есть опция рассчитывать выражение накопительно. В ряде случаев этого может быть вполне достаточно.
Спасибо за информацию! Ознакомлюсь!
Ниже скрипт календаря :
// Определение дат начала и окончания диапазона
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;
В вложении файл qvw, продажи подсчитаны в чарте с начала года, используя функцию InYearToDate + с помощью Set Analysis. Способ с if-ами не самый удачный. (в плане скорости работы)
Покажите на данном файле , что Вам необходимо получить в итоге.
Спасибо!
Но - если эта дата не "today", а дата из истории - к примеру мне нужно сравнить продажи с начала года на дату 01.06.2007, для дальнейшего сравнения с другими периодами.
Вроде получилось :
Sum({<Год=, Месяц=, Квартал=, Неделя=, День=, DateNum={">=$(=Num(YearStart(Max(DateNum))))<=$(=Max(DateNum))"}>} Price )
Поправьте, если что то сделано неверно.
Цитата: 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 (http://help.qlik.com/ru-RU/qlikview/12.1/Subsystems/Client/Content/Alternate%20States.htm)
Т.е. Вы создадите аналогичные фильтры по датам, но выберете в настройках иное альтернативное состояние(например, "alt1"). Далее в экспрешене будете его использовать : Sum({alt1}...Price)
Да, при выборе Orderdate все становится печально.
Я пришел к выводу что нужно делать флаги в скрипте загрузки для YTD и LYTD.
Осталось разобраться как верно это сделать :)
Привет,
фрагмент в помощь:
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
Коллеги, я использую 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 ) Но безуспешно.
Ушел разбираться как использовать флаги в выражениях...
Для начала проверьте наличие флага в календаре и корректность его значений.
Коллеги,
Флаги вроде на месте. При создании фильтра по ним, выдают 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)
Я в смятении :(
Сможете выложить пример? Так тяжело разбираться, не видя скрипта, модели данных.
Все получилось через использование правильных переменных!
Спасибо!