Calendar Qlik-如何使用集合分析对数据进行求和,直到最后一个可用记录,而不是最后一个日历日期
我的表情目前看起来像这样:Calendar Qlik-如何使用集合分析对数据进行求和,直到最后一个可用记录,而不是最后一个日历日期,calendar,qlikview,qliksense,Calendar,Qlikview,Qliksense,我的表情目前看起来像这样: Sum({$<[Calendar Date] = { <=$(=Date(MonthEnd(Date(Today())))) >=$(=Date(AddMonths(MonthStart(Date(Today())), - 12)))"}>} [Amount]) Companies MonthYear Amount Company1 201701 10000 Company1 201612 20000 Company2
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
这就是我想要实现的目标:
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
例如:
- 公司1拥有截至201701的数据-->从201601到201701的数据总和
- 公司2拥有到201611的数据-->从201511到201611的数据总和
- 公司3拥有截至201612的数据-->从201512到201612的数据总和
- 公司1拥有截至201701的数据-->从201601到201701的数据总和
- 公司2拥有截至201611的数据-->从201601到201701的数据总和
- 公司3拥有截至201612的数据-->从201601到201701的数据总和
=Sum({<MonthYear={'$(=Max(MonthYear))'}>}Amount)
=总和({}金额)
我想出了我必须使用的表达式:
我只需将今天()替换为可用金额的最大月份
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])
Sum({$<[日历日期]={”
}
[日历日期],[公司]()()()())())())
>=$(=日期(月)开始日期(月)结束日期(月)结束日期(
Aggr(Max({$}
[日历日期],[公司]()()()()()()()),(12)
我知道您已经回答了自己的问题,但想提出另一个建议
如果您希望在一段时间内(即去年)聚合值,并且只希望查看去年,则可以通过在数据模型中添加一些标志来降低集合分析的复杂性。我知道这不是集合分析,但如果它扩展,它将提高UI的性能,因为您正在使用许多复杂的函数来实现我们可以在模型中简单实现的功能
此加载脚本执行三项操作:
Sum({$}金额)
这里比较了amount字段通常要求和的内容,并与set analysis进行了比较(这会删除我添加的额外记录,这是故意超出范围的)
这是加载脚本
// 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;
//加载原始数据-用于清除日期的前一个加载。我在底部添加了一个新行,故意超出了它应该选择的日期范围
可原创:
负载
公司,
日期(日期#([日历日期],'YYYYMM'))为[日历日期],
数量
加载*内联[
公司、日历日期、金额
公司1,201701,10000
公司1,201612200000
公司2,201701-
公司2,201612-
公司216113500
公司2,201610,17000
公司3,201701-
公司3,201612,50000
公司320161110000
公司32016124000
公司3,201609,40000
公司3,201608-
公司3,201607-
公司32060632000
公司320160518000
公司3,20140550000
];
//从加载的表中获取最大日期
临时最大日期:
负载
公司,
MAX([日历日期])作为CalendarDateMax
居民原创
其中金额>0
按公司分组;
//这是一个骗局,但我把它放进去了,因为你的数据集很小。它将遍历并创建过去12年中每个公司每个月的加入记录
//我会用这个连接回我的旗帜的原始表格。请注意,它在两个字段上连接-一个键会更好
左连接(可原始)
负载
公司,
日期(AddMonths(CalendarDateMax,-iterNo()+1))作为[日历日期],
1作为标志
常驻临时工(最大日期)
虽然AddYears(CalendarDateMax,-1)表示感谢,但这将仅显示特定公司的最大月份金额,这是不够的。我正在尝试获取一个范围:上个月,特定公司的可用数据-->该月前12个月。如果您查看我的表达式,我需要找到一种方法,用一个变量替换Today(),该变量使用每个公司可用的数据检测上个月的数据。