mdx 聚合函数

聚合函数Aggregation(set_express, numeric_express), Aggregation(http://msdn.microsoft.com/zh-cn/library/ms145524.aspx)执行求和函数, 如果和某些其他求和函数配合的话, 会有变化. 看一个例子

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(*), 订单数量.

mdx 聚合函数_第1张图片想增加一行. 汇总一下这前五的信息. 于是, 我们写一个计算列.如下

因为是添加一行, 那么肯定是用类似于上面的元组+元组. 所以计算列是属于[Product].[Subcategory].元组的. 定义如下

with 
member [Product].[Subcategory].[top5] as
    sum(
        topcount([Product].[Subcategory].[Subcategory].Members,
            5,
            [Measures].[Reseller Sales Amount]
            )
        ,[Measures].[Reseller Sales Amount]
        )    

得到

mdx 聚合函数_第2张图片哦, 错了. 这只是得到是Sales Amount一个死的Sum值. 在这里我们忽视了一个东西, CurrentMember, 类似于游标指针似的一个玩意. 它不仅是用在Measures被Dim打乱上(列上被行的打乱), 还可以用在Dim在不同的Measures上的表现, (行被列限定. ).  在这里, colomn上的measures有三个成员. 因此可以用

mdx 聚合函数_第3张图片

这样得到的结果是mdx 聚合函数_第4张图片可是最后一个值的5026明显不是distinctCount, 而是一个简单是sum运算. 这违背了我们的初衷. 这个时候, 就不能使用简单是sum聚合了. 需要保持原来聚合的Aggregation函数. 最终结果如下

mdx 聚合函数_第5张图片

加一个有趣的东西imageimage

 

 

AVG函数.

mdx 聚合函数_第6张图片这样一个简单的东西. 每年的销售额的订单数. 现在我们需要当年的月平均销售额.

下面我们再来复习一下作用域的概念.

with 
member Measures.MonthValue as
    avg(
        [Measures].[Reseller Sales Amount]
        )

现在是这样. 没有限定任何作用域. 那么这个度量值将会被行维度给打散. 结果如图.

mdx 聚合函数_第7张图片这是查询出来了每一年的销售额. 好无聊的操作. 呵呵.

假设给avg第一个参数赋值, set_express 设置为

with 
member Measures.MonthValue as
    avg(
        [Date].[Calendar].[Month].members
        ,
        [Measures].[Reseller Sales Amount]
        )
相当于得到一个死的值. 已经计算完的.  这个值是所有的月份的销售额 之和/月数.

image, 其实我们需要这个值和每个年份做关联, 被打散. 这个时候, 就需要existing关键字出马了.

existing强制在当前的区域内做运算. 理解为, 度量值强制在当前的区域内被切割.

得到image

这个时候, 突然想到. 其实我们在指定月份的时候, 不也是可以指定他的区域吗?

比如这样写.

with 
member Measures.MonthValue as
    avg(
        ([Date].[Calendar Year].currentmember,[Date].[Calendar].[Month].members),
        [Measures].[Reseller Sales Amount]
        )
这样限定了. 月份的成员是属于在行的当前的区域范围内. 结果果然是正确得到了和使用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]
;

一个很神奇的东西

mdx 聚合函数_第8张图片

你可能感兴趣的:(mdx 聚合函数)