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的数据总和
我需要如何更改表达式,以便我的仪表板将上一个可用月份的[Amount]字段与每个公司的数据相加,直到该日期之前的12个月

PS:Today()=2016年1月23日这可能有效

=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的性能,因为您正在使用许多复杂的函数来实现我们可以在模型中简单实现的功能

此加载脚本执行三项操作:

  • 加载您的数据(我必须格式化日期,以便QV能够识别)
  • 获取每个公司的最新日期和金额
  • 迭代以创建过去12个月的列表,并将其作为标志字段(flag_LatestYear)连接回原始表
  • 然后,在集合分析中,您可以在图表中使用以下表达式(其中“公司”字段作为维度)

    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(),该变量使用每个公司可用的数据检测上个月的数据。