聚合函数Aggregation(set_express, numeric_express), Aggregation()执行求和函数, 如果和某些其他求和函数配合的话, 会有变化. 看一个例子
SELECT
{
([Measures].[Reseller Sales Amount]),
([Measures].[Reseller Transaction Count]),
([Measures].[Reseller Order Count])
} ON COLUMNS,
TopCount(
{[Product].[Subcategory].[Subcategory].Members},
5,
([Measures].[Reseller Sales Amount])
) +
{([Product].[Subcategory].[All Products])}
ON ROWS
FROM [Step-by-Step]
很简单. 按销售量排序排名前五的销售小类别的三个值的表现. 第一个是金额, 是sum, 第二个是交易数量, 是count(*), 第三个是distinctCount(*), 订单数量.
想增加一行. 汇总一下这前五的信息. 于是, 我们写一个计算列.如下
因为是添加一行, 那么肯定是用类似于上面的元组+元组. 所以计算列是属于[Product].[Subcategory].元组的. 定义如下
with
member [Product].[Subcategory].[top5] as
sum(
topcount([Product].[Subcategory].[Subcategory].Members,
5,
[Measures].[Reseller Sales Amount]
)
,[Measures].[Reseller Sales Amount]
)
得到
哦, 错了. 这只是得到是Sales Amount一个死的Sum值. 在这里我们忽视了一个东西, CurrentMember, 类似于游标指针似的一个玩意. 它不仅是用在Measures被Dim打乱上(列上被行的打乱), 还可以用在Dim在不同的Measures上的表现, (行被列限定. ). 在这里, colomn上的measures有三个成员. 因此可以用
这样得到的结果是可是最后一个值的5026明显不是distinctCount, 而是一个简单是sum运算. 这违背了我们的初衷. 这个时候, 就不能使用简单是sum聚合了. 需要保持原来聚合的Aggregation函数. 最终结果如下
加一个有趣的东西
AVG函数.
这样一个简单的东西. 每年的销售额的订单数. 现在我们需要当年的月平均销售额.
下面我们再来复习一下作用域的概念.
with
member Measures.MonthValue as
avg(
[Measures].[Reseller Sales Amount]
)
现在是这样. 没有限定任何作用域. 那么这个度量值将会被行维度给打散. 结果如图.
这是查询出来了每一年的销售额. 好无聊的操作. 呵呵.
假设给avg第一个参数赋值, set_express 设置为
with
member Measures.MonthValue as
avg(
[Date].[Calendar].[Month].members
,
[Measures].[Reseller Sales Amount]
)
, 其实我们需要这个值和每个年份做关联, 被打散. 这个时候, 就需要existing关键字出马了.
existing强制在当前的区域内做运算. 理解为, 度量值强制在当前的区域内被切割.
得到
这个时候, 突然想到. 其实我们在指定月份的时候, 不也是可以指定他的区域吗?
比如这样写.
WITH
MEMBER [Measures].[Products] AS
Count(
EXISTING {[Product].[Product].[Product].Members}
)
MEMBER [Measures].[Products List] AS
Generate(
EXISTING {[Product].[Product].[Product].Members},
[Product].[Product].CurrentMember.Name,
" .. "
)
SELECT
{
([Measures].[Products]),
([Measures].[Products List])
} ON COLUMNS,
{[Product].[Subcategory].Members} ON ROWS
FROM [Step-by-Step]
;
一个很神奇的东西