Set Analysis и конструкция if не распознают переменные с датой (Qlikview, Sense)

Автор Софья, 28 сентября 2015, 07:47:17

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

Софья

Всем добрый день.

Давно у меня уже висит задача, с которой разобраться не могу. Сейчас появляются на работе задачи, поэтому она стала критичной.
К сути - у меня Set Analysis и конструкция if не распознают переменные с датой.

1) Касаемо Set Analysis:

Есть стандартный синтаксис, где задаются переменные с датой:
SET vYearMin = 2004;
SET vYearMax = 2014;
SET vYearCurr = 2015;

Потом данные переменные должны работать в формуле:
=SUM({$ <Год = {'>=$(vYearMin)<=$(vYearMax)'}>} Продажи)
В своём случае я задаю переменные:
SET vDate1 = "'17.08.2015 00:00:00','DD.MM.YYYY HH24:MI:SS'";     
SET vDate2 = "'19.08.2015 23:59:59','DD.MM.YYYY HH24:MI:SS'";

Подставляю их в формулу:
=SUM({$ <Doc_date = {'>=$(vDate1)<=$(vDate2)'}>} Приход)

Формула выдаёт 0. К слову, данная конструкция не видит переменные, т. е. они становятся серыми, когда я убираю фигурные скобки и кавычки одинарные.
Забыла описать саму задачу.
Мне необходимо задать период с понедельника по среду, чтобы поле суммировало приходы за 3 дня. Причём, чтобы один столбец всегда показывал бы предыдущую неделю, а второй текущую - сравнительная аналитика по приходам нужна.
Возможно ли задать данные периоды динамически, чтобы постоянно не переписывать даты? И как быть с переменными, если он их не видит, есть ли другие способы решения данной задачи?
Наверное, стоит уточнить, что поле doc_date содержит массив дат (скрин 2 во вложении). Возможно ли несооттвествие из-за того, что данное поле содержит дату в таком виде? К слову, именно к этому полю у меня прикреплён календарь (скрин 3 во вложении), дату идентифицирует корректно.

2) Касаемо if:

Пишу формулу, но она очень странно работает:
if(DOC_DATE = $(vM1), sum(KOL))

Допустим, нужно просуммировать приход за 17 сентября. Пишу, если doc_date = 17 сентября (переменная), то суммируй приход.
Работает в моём случае эта формула так - она суммирует любые другие даты, кроме указанной. Когда же выбираю роковое 17 сентября, то она выдаёт формат даты (скрин 4 во вложении).
С чем это может быть связано? Или есть какие-то нюансы в данной конструкции, которые я не учла?

Буду благодарна за любую помощь, голову уже сломала, не могу понять, где я допустила ошибки.

DmitryK

#1
Доброе утро, Софья!

Попробуйте даты задать в таком формате:


LET vDate1Tmp = MakeDate(2015,08,17);
LET vDate2Tmp = MakeDate(2015,08,19);

LET vDate1 = floor($(vDate1Tmp));
LET vDate2 = floor($(vDate2Tmp));


В скрипте DOC_DATE прописать как

floor(DOC_DATE) as DOC_DATE


Задаем даты. Преобразуем их в числа. При изменении дат, они автоматически будут преобразованы в числа, соответственно. Даты задаем в переменных с Tmp, в формулах используем переменные vDate1 и vDate2.

Соответственно подставляя в формулы


SUM({$ <Doc_date = {'>=$(vDate1)<=$(vDate2)'}>} Приход)


Формат времени указывать не обязательно, потому что и так возьмутся целые дни.
Пишу на коленке, поэтому могут быть "Очепятки" :-)

Насчет if.
Судя по тому что я вижу, то могу предположить, что формула отрабатывает не корректно, потому что разные форматы дат. Поэтому лучше использовать все тот же floor (Округление в меньшую сторону). С числами проще работать, чем с датами.


if(floor(DOC_DATE) = floor($(vM1)), sum(KOL))

bibis


Софья

Цитата: DmitryK от 28 сентября  2015, 10:36:32  
Попробуйте даты задать в таком формате:


LET vDate1Tmp = MakeDate(2015,08,17);
LET vDate2Tmp = MakeDate(2015,08,19);

LET vDate1 = floor($(vDate1Tmp));
LET vDate2 = floor($(vDate2Tmp));


В скрипте DOC_DATE прописать как

floor(DOC_DATE) as DOC_DATE



Дмитрий, спасибо Вам большое за Ваши ответы - они всегда последовательные и подробные.)
Даты задавать в таком формате не пробовала - сейчас буду тестировать.
Вот с Floor проблема, как бы я его не прописывала, на этапе отладки у меня всегда выдаёт всяческие ошибки. Буду разбираться.

Bibis, спасибо Вам, буду пробовать.

Софья

Цитата: bibis от 28 сентября  2015, 10:40:17  
Добрый день. По второму пункту
sum(if(DOC_DATE = $(vM1),KOL))

Добрый день.

Когда sum вынесла за общую скобку, ушёл формат даты из поля, но по-прежнему показывает 0, когда я выбираю дату, по который нужно просуммировать.

Это нормальная ситуация?

DmitryK

Доброе утро, София!

Попробуйте принудительно привести в числовой формат даты или в формат даты:


sum(if(floor(DOC_DATE) = floor($(vM1)),KOL))


Или


sum(if(date(DOC_DATE) = date($(vM1)),KOL))


С Уважением, Дмитрий

Софья

Добрый день, Дмитрий.

Как раз вся проблема в том, что я никак не могу применить floor к полю doc_date. Вот кусочек кода, где у меня прописано, каким образом загружается дата:TO_CHAR(D.DOC_DATE, 'dd.mm.yyyy') AS DOC_DATE,
    TO_CHAR(D.DOC_DATE, 'yyyy') AS YEAR,
    TO_CHAR(D.DOC_DATE, 'month') AS MONTH,
    TO_CHAR(D.DOC_DATE, 'day') AS DAY


Дату не могу задать в том виде, в котором Вы мне советовали - через LET и MakeDate, у меня на отладке возникает ошибка - скрин во вложении.

Понимаю, что где-то идёт несоответствие по датам и по формату, но не могу пока определить.

DmitryK

Добрый день, Софья.

Как я понимаю представленный кусок кода написан на SQL.

Попробуйте сделать так:

load *,
date(DOCDATE_Tmp) as DOC_DATE, // Если необходимо число, тогда floor(DOCDATE_Tmp)
YEAR(DOCDATE_Tmp) as YEAR,
MONTH(DOCDATE_Tmp) as MONTH,
DAY(DOCDATE_Tmp) as DAY
;
Select D.DOC_DATE as DOCDATE_Tmp
FROM BlaBlaBla;


В этом случае из базы вы грузите дату в том виде как она есть, а потом обрабатываете ее с помощью QlikView.

Роман

Софья,

для суммирования дней с понедельника по среду можно воспользоваться функцией WeekDay() и ее числовой формой num(WeekDay()). Вот пример (названия столбцов из моей модели, но, думаю, все понятно :)):

=num(WeekDay(min({<CalDate={'=sum({<Fact={Sales}>}NetSls)>0'}>}CalDate)))& chr(13)&
WeekDay(min({<CalDate={'=sum({<Fact={Sales}>}NetSls)>0'}>}CalDate))& chr(13)&
min({<CalDate={'=sum({<Fact={Sales}>}NetSls)>0'}>}CalDate)


WeekDay() выдает имя дня недели ("Пн"-"Вс" в моем случае), num(WeekDay()) - номер с 0 (для "Пн") до 6 (для "Вс").

Для суммирования понедельников-вторников-сред можно в Set Analysis ограничить множество номеров дней недели от 0 до 2 включительно. Только границами недели текущей и предыдущей нужно будет озаботиться отдельно. ))

Mad

Возникла такая же проблема как и у ТС. С годами работает с датами нет. После дня мозгового штурма решение найдено.
следующее

SUM({$ <Doc_date = {'>=$(vDate1)<=$(vDate2)'}, Year=, Month=, Week=, Day=>} Приход)

т.е. отключаем в календаре все выборки какие может сделать пользователь и вуаля эта чудо система начинает работать. Потрясающее. Молодцы разработчики очень грамотно все задокументировали.

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