Qlikview 自动化过去 12 个月的选择
Qlikview Automate past 12 months selection
我有一个组合图表,显示了一个人支付账单的平均天数。
图表的维度是= [Pay Month Year last 12 months]
没有维度限制
有 1 个表达式 Average
其定义是:
avg({< InvoicefromSqlType = {'Invoices'},[Is Invoice Paid] = {'Y'},[Is Positive Amount] = {'Y'},[Is Paid last 12 months] = {'Y'},DueGroups=,[Pay Month Year last 12 months]=>}[Days to Pay])`
按表达式排序,即[Pay Month Year last 12 months]
现在上面的字段是这样建立起来的:
[最近 12 个月的工资月年]
If([Pay Date] >= '$(vPeriodS12)',[Pay Month year]) as [Pay Month Year last 12 months],
PayLoadOrder:
Load * Inline [Pay Month Year last 12 months
May-2014
Jun-2014
Jul-2014
Aug-2014
Sep-2014
Oct-2014
Nov-2014
Dec-2014
Jan-2015
Feb-2015
Mar-2015
Apr-2015
May-2015
];
现在发生的事情是每个月结束时,需要手动添加下个月并删除第一个月(例如,在上面我会删除行 May-2014 并在最后添加2015 年 6 月线)
此外,如果定义了尚无数据的月份,即您对 2015 年 6 月进行了硬编码,而当前月份为 2015 年 5 月,则 2015 年 6 月将显示 2014 年的数据,并且月份的顺序将搞混了。
我想做的是完全消除对上述几个月进行硬编码的需要,并自行完成。
如果您需要任何更多信息,请告诉我
与其使用您可能必须手动更新的 "sort order" table,不如执行以下操作:
创建一个派生自 [Pay Date]
的新字段,returns 您可以对月份和年份进行排序。例如:
dual(date(makedate(year([Pay Date]),num(month([Pay Date]))),'MMM-yyyy'),
year([Pay Date]) * 100 + num(month([Pay Date]))) as PayMonthYear
在这里,dual
函数允许您将字段值的不同表示与其基础值相关联。例如,这里我们设置基础数据为 [Pay Date]
的年份加上月份,但声明它应该显示为 MMM-yyyy
。例如,在内部,QV 仍然看到值 201502,但将其显示为 Feb-2015。这意味着您可以根据其基础值对其进行正确排序。
使用dual
是一个很大的话题,请参考QV的内置帮助以获取更多信息。
将图表维度从 [Pay Month Year last 12 months]
更改为使用 PayMonthYear
并将排序设置为升序。这意味着您的月份将被正确排序,即使添加了新的月份。
从您的脚本中删除 table PayLoadOrder
。
替代方法
另一种方法是使用加入您的 Pay Date
字段的日历 table。这将实现相同的目的,但是,您也可以将 "year to date" 指标也集成到日历中,并将其从主 table 中删除。下面显示了我快速拼凑的一个示例:
MinMax:
LOAD
Max([Pay Date]) AS MaxDate,
Min([Pay Date]) AS MinDate
RESIDENT MyData;
LET varMinDate = Num(Peek('MinDate',0,'MinMax')); // 0 is first record
LET varMaxDate = Num(Peek('MaxDate',-1,'MinMax')); // -1 is last record
LET varToday = Num(Today());
MasterCalendar:
LOAD
monthstart([Pay Date]) >= monthstart(AddMonths(Today(),-12)) as PaidInLast12MonthsFlag,
dual(date(makedate(year([Pay Date]),num(month([Pay Date]))),'MMM-yyyy'),year([Pay Date]) * 100 + num(month([Pay Date]))) as PayMonthYear
[Pay Date];
LOAD
date($(varMinDate) + RecNo() - 1,'DD/MM/YYYY') as [Pay Date]
AUTOGENERATE num($(varMaxDate)) - num($(varMinDate)) + 1;
DROP TABLE MinMax;
因此,在上面,如果 [Pay Date]
字段的值出现在最近 12 个月内,则字段 PaidInLast12MonthsFlag
等于 -1
,否则 0
.您可以在集合分析表达式中将其用作过滤器。此外,您可以使用 PayMonthYear
作为图表维度。
我有一个组合图表,显示了一个人支付账单的平均天数。
图表的维度是= [Pay Month Year last 12 months]
没有维度限制
有 1 个表达式 Average
其定义是:
avg({< InvoicefromSqlType = {'Invoices'},[Is Invoice Paid] = {'Y'},[Is Positive Amount] = {'Y'},[Is Paid last 12 months] = {'Y'},DueGroups=,[Pay Month Year last 12 months]=>}[Days to Pay])`
按表达式排序,即[Pay Month Year last 12 months]
现在上面的字段是这样建立起来的:
[最近 12 个月的工资月年]
If([Pay Date] >= '$(vPeriodS12)',[Pay Month year]) as [Pay Month Year last 12 months],
PayLoadOrder:
Load * Inline [Pay Month Year last 12 months
May-2014
Jun-2014
Jul-2014
Aug-2014
Sep-2014
Oct-2014
Nov-2014
Dec-2014
Jan-2015
Feb-2015
Mar-2015
Apr-2015
May-2015
];
现在发生的事情是每个月结束时,需要手动添加下个月并删除第一个月(例如,在上面我会删除行 May-2014 并在最后添加2015 年 6 月线)
此外,如果定义了尚无数据的月份,即您对 2015 年 6 月进行了硬编码,而当前月份为 2015 年 5 月,则 2015 年 6 月将显示 2014 年的数据,并且月份的顺序将搞混了。
我想做的是完全消除对上述几个月进行硬编码的需要,并自行完成。
如果您需要任何更多信息,请告诉我
与其使用您可能必须手动更新的 "sort order" table,不如执行以下操作:
创建一个派生自
[Pay Date]
的新字段,returns 您可以对月份和年份进行排序。例如:dual(date(makedate(year([Pay Date]),num(month([Pay Date]))),'MMM-yyyy'), year([Pay Date]) * 100 + num(month([Pay Date]))) as PayMonthYear
在这里,
dual
函数允许您将字段值的不同表示与其基础值相关联。例如,这里我们设置基础数据为[Pay Date]
的年份加上月份,但声明它应该显示为MMM-yyyy
。例如,在内部,QV 仍然看到值 201502,但将其显示为 Feb-2015。这意味着您可以根据其基础值对其进行正确排序。使用
dual
是一个很大的话题,请参考QV的内置帮助以获取更多信息。将图表维度从
[Pay Month Year last 12 months]
更改为使用PayMonthYear
并将排序设置为升序。这意味着您的月份将被正确排序,即使添加了新的月份。从您的脚本中删除 table
PayLoadOrder
。
替代方法
另一种方法是使用加入您的 Pay Date
字段的日历 table。这将实现相同的目的,但是,您也可以将 "year to date" 指标也集成到日历中,并将其从主 table 中删除。下面显示了我快速拼凑的一个示例:
MinMax:
LOAD
Max([Pay Date]) AS MaxDate,
Min([Pay Date]) AS MinDate
RESIDENT MyData;
LET varMinDate = Num(Peek('MinDate',0,'MinMax')); // 0 is first record
LET varMaxDate = Num(Peek('MaxDate',-1,'MinMax')); // -1 is last record
LET varToday = Num(Today());
MasterCalendar:
LOAD
monthstart([Pay Date]) >= monthstart(AddMonths(Today(),-12)) as PaidInLast12MonthsFlag,
dual(date(makedate(year([Pay Date]),num(month([Pay Date]))),'MMM-yyyy'),year([Pay Date]) * 100 + num(month([Pay Date]))) as PayMonthYear
[Pay Date];
LOAD
date($(varMinDate) + RecNo() - 1,'DD/MM/YYYY') as [Pay Date]
AUTOGENERATE num($(varMaxDate)) - num($(varMinDate)) + 1;
DROP TABLE MinMax;
因此,在上面,如果 [Pay Date]
字段的值出现在最近 12 个月内,则字段 PaidInLast12MonthsFlag
等于 -1
,否则 0
.您可以在集合分析表达式中将其用作过滤器。此外,您可以使用 PayMonthYear
作为图表维度。