在商业智能领域,数据的可视化和清晰的传达至关重要。传统上,这种汇总和聚合工作通常在仪表板工具的范畴之外进行。本文将探讨Qlikview如何通过其独特的架构和AGGR()函数,实现数据的直接汇总和聚合,从而无需依赖数据集市或数据仓库。
Qlikview与传统的商业智能架构不同,它能够直接连接到输入系统,并在内部添加层,这意味着不需要数据集市或数据仓库。AGGR函数是Qlikview中一个非常强大的聚合函数,但由于缺乏了解或熟悉度,有时会被忽视。AGGR语句创建了一个临时的结果表,其中包含一个可以按一个或多个维度进行分组的表达式,类似于SQL中的“Group by”。
虚拟表的结果可以被外部聚合函数使用,它可以在表达式和维度中使用(计算维度)。AGGR函数的语法如下:
aggr ([ distinct | nodistinct ] [{set_expression}]expression {, dimension})
当需要进行两步聚合时,比如计算公司顶级销售产品的总销售额或产品和公司的最高平均销售额,都会使用到AGGR函数。此外,当需要识别某个细分市场中的顶部/底部人群时,AGGR函数也变得更加强大,尤其是当它与集合分析、Rank()、FirstSortedValue()等函数一起使用时。
以下是一个示例数据集,为了更好地展示聚合的各个方面,选择了交易数据。
现在,将探讨如何在图表、透视表或普通表中使用简单的AGGR函数。以下是一些可以使用AGGR函数的例子:
计算公司顶级销售产品的销售额。虽然可以使用SUM()函数简单地计算公司的总销售额(例如SUM(Sale)),但如果需要计算公司顶级销售产品的销售额,将使用AGGR函数进行两步聚合。
=Max ( aggr ( sum ( Sale ), Company_Name , Product ) )
在上述场景中,需要在AGGR语句中包含那些维度(Company_Name和Product)……
接下来的场景是计算公司产品的最高平均销售额。为此,需要在AGGR语句中包含平均销售额的表达式“SUM(Sale)/Count(Product)”和所需的维度:
=Max( aggr ( sum(Sale)/Count(Product) , Company_Name, Product ) )
在这种情况下,Qlikview将为每个产品和公司生成一个临时表,用于计算平均销售额,然后MAX函数将识别最大值。
在上面的例子中,表达式与当前选择集一起工作,但如果想比较前一年顶级销售产品的销售额与当前年份,那么必须在表达式中使用集合分析方法。
如果对集合分析不熟悉,请参考之前的文章《QlikView中的集合分析——简化版!》。
要返回前一年顶级销售产品的销售额,需要编写一个集合表达式:
=Max({} aggr (sum( {} Sale),Company_Name,Product))
在上面的表达式中,在MAX函数和AGGR函数中都使用了集合表达式。
让考虑一个场景,必须确定在选定期间内,按公司计算销售额最高的产品名称。为此,必须将AGGR函数与FIRSTSORTEDVALUE()函数一起使用。
FIRSTSORTEDVALUE函数返回按相应排序权重排序的表达式的第一个值。排序权重应该是数值,如果多个表达式值共享相同的排序顺序,则返回NULL值,除非采取其他措施来解决这个问题。
要从虚拟表中提取基于最高销售额的产品名称,需要编写如下表达式:
=FIRSTSORTEDVALUE (Product, – aggr(sum(Sale),Company_Name,Product) )
在上面的表达式中,AGGR语句生成了一个包含公司和产品总销售额的虚拟表。然后,FIRSTSORTEDVALUE函数从虚拟表中识别出销售额最高的产品名称。因为AGGR函数前面有一个负号(-),所以它将返回销售额最高的产品名称。
使用AGGR函数的最佳用例之一是识别顶部/底部细分市场。在这里,将确定2012年和2013年跨年度的前两个产品,如下所示:
为了实现这一点,将使用Concat()和Rank()函数与AGGR语句一起使用。完整的表达式如下:
=concat ( IF( aggr ( Rank(sum(Sale)),Product)<=2, Product & chr(10)))
“aggr(Rank(Sum(Sale)),Product)”表达式创建了一个包含产品和销售额排名的虚拟表。下一步是在IF语句中添加,请求只接收结果中的前两个产品。因此,如果虚拟AGGR表中的排名<=2,则显示产品,否则返回null()。
最后,希望在文本对象中显示这些结果。使用了CONCAT()函数来连接这两个产品值。为了在两个产品之间添加一个单独的行,使用了chr(10)。
本文是一个示例,展示了如何在Qlikview中使用AGGR。是否有更多技巧使AGGR更有趣?如果不是,认为这篇文章将使能够在下一个仪表板中使用AGGR函数吗?请让知道对在QlikView中使用此功能的想法。