2017-01-24 14 views
0

Мое выражение выглядит в настоящее время следующим образом:Qlik - Как использовать Set Analysis, чтобы подвести до последней доступной записи с данными, а не в последний день календарного

Sum({$<[Calendar Date] = { 
<=$(=Date(MonthEnd(Date(Today())))) 
>=$(=Date(AddMonths(MonthStart(Date(Today())), - 12)))"}>} [Amount]) 

Это как данные выглядит следующим образом:

Companies MonthYear Amount 
Company1 201701 10000 
Company1 201612 20000 
Company2 201701 - 
Company2 201612 - 
Company2 201611 35000 
Company2 201610 17000 
Company3 201701 - 
Company3 201612 50000 
Company3 201611 10000 
Company3 201610 24000 
Company3 201609 40000 
Company3 201608 - 
Company3 201607 - 
Company3 201606 32000 
Company3 201605 18000 

Это то, что я хочу добиться:

Пример:

  • Company1 есть данные до 201701 -> сумма данных от 201601 до 201 701
  • Общества2 не имеет данных до 201611 -> сумма данных от 201511 до 201611
  • Company3 не имеет данных до 201612 - -> сумма данных от 201512 до 201612

Но так как я использую сегодня(), как мой предел у меня возникли следующие отображения: (ЭТО НЕ ТО, ЧТО Я ХОЧУ ДОСТИЧЬ)

Пример:

  • Company1 имеет данные до 201701 -> сумма данных от 201601 до двести одна тысяча семьсот один
  • Общества2 не имеет данных до 201611 -> сумма данных от 201601 до 201701
  • Company3 не имеет данных до 201612 -> сумма данных от 201601 до 201701

Как мне изменить выражение, чтобы моя приборная панель суммировала поле [Сумма] из последнего доступного месяца с данными для каждой компании до 12 месяцев до этого d ел?

PS: Сегодня() = 23 янв 2016 г.

ответ

0

Я понял, что выражение, которое я должен использовать:

Я только что для замены Today() максимальным месяцем, где была доступна сумма

Sum({$< [Calendar Date] = {" 
<=$(=Date(MonthEnd(Date(Date(MonthEnd(Date(Max(Aggr(Max({$<[Calendar Date] = 
{"<=$(=Date(MonthEnd(Date(Today()))))"}, [Amount] = {"<>0"}>} 
[Calendar Date]), [Companies]))))))))) 
>=$(=Date(AddMonths(MonthStart(Date(Date(MonthEnd(Date(Max(
Aggr(Max({$<[Calendar Date] = {"<=$(=Date(MonthEnd(Date(Today()))))"}, [Amount] = {"<>0"}>} 
[Calendar Date]), [Companies]))))))), -12)))"}>} [Amount]) 
0

Это может сработать ...

=Sum({<MonthYear={'$(=Max(MonthYear))'}>}Amount) 
+0

Спасибо, но это покажет только максимальный месяц для конкретной компании, этого недостаточно. Я пытаюсь получить диапазон: * В прошлом месяце с данными, доступными для конкретной компании * -> * за 12 месяцев до этого месяца *. Если вы посмотрите на мое выражение, мне нужно найти способ заменить Today() переменной, которая обнаруживает последний месяц с данными, доступными для каждой компании. – ay43210

0

Я вижу, что вы ответили на свой вопрос, но хотите предложить другое предложение.

Если вы хотите суммировать значения за периоды времени (т. Е. В прошлом году), и вы только захотите взглянуть на последний год, вы можете уменьшить сложность этого набора, поставив несколько флагов в свои модель данных. Я знаю, что это не заданный анализ, но он улучшит производительность вашего пользовательского интерфейса, если он масштабируется, поскольку вы используете ряд сложных функций для достижения чего-то, что мы можем сделать просто в модели.

Этот сценарий нагрузки делает три вещи:

  1. загружает данные (я должен отформатировать дату так QV признает его)
  2. Возвращает последнюю дату с суммы в каждой компании
  3. итерацию для создания списка за последние 12 месяцев и присоединяет его обратно к исходной таблице в качестве поля флага (Flag_LatestYear)

Затем в вашем анализе набора вы можете использовать следующее выражение в ваши диаграммы (где у них есть поле «компании» как измерение).

Sum({$<Flag_LatestYear={1}>}Amount) 

Вот сравнение того, что поле сумма обычно просуммировать, и с множеством анализа (который удаляет дополнительную запись, которую я добавил - что намеренно из диапазона)

Normal Sum vs Set Analysis for the latest 12 months available for each company

Вот сценарий загрузки.

// Load raw data - preceding load used to clean up date. I added a new row at the bottom that was deliberately out of the date range it should pick up 
OriginalTable: 
LOAD 
    Companies, 
    DATE(DATE#([Calendar Date],'YYYYMM')) AS [Calendar Date], 
    Amount; 
LOAD * INLINE [ 
    Companies, Calendar Date, Amount 
    Company1, 201701, 10000 
    Company1, 201612, 20000 
    Company2, 201701, - 
    Company2, 201612, - 
    Company2, 201611, 35000 
    Company2, 201610, 17000 
    Company3, 201701, - 
    Company3, 201612, 50000 
    Company3, 201611, 10000 
    Company3, 201610, 24000 
    Company3, 201609, 40000 
    Company3, 201608, - 
    Company3, 201607, - 
    Company3, 201606, 32000 
    Company3, 201605, 18000 
    Company3, 201405, 50000 
]; 


// Grab the max dates from the loaded table 
TEMP_MaxDate: 
LOAD 
    Companies, 
    MAX([Calendar Date]) AS CalendarDateMax 
RESIDENT OriginalTable 
WHERE Amount > 0 
GROUP BY Companies; 

// This is a cheat, but I've put it in as your dataset is small. It'll iterate through and create joining records for every month in the last 12, per company 
// I'll use this to join back to the OriginalTable for my flag. Note that it joins on two fields - a key would be better 
LEFT JOIN (OriginalTable) 
LOAD 
    Companies, 
    DATE(AddMonths(CalendarDateMax,-iterNo() + 1)) AS [Calendar Date], 
    1 AS Flag_LatestYear 
RESIDENT TEMP_MaxDate 
WHILE AddYears(CalendarDateMax,-1) <= AddMonths(CalendarDateMax,-iterNo() + 1); 

// Clean up and remove the temp table 
DROP TABLE TEMP_MaxDate; 

Как всегда, будут другие способы достижения этого! Дайте мне знать, если это будет полезно.