mdx 聚合函数

聚合函数Aggregation(set_express, numeric_express), Aggregationhttp://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(*), 订单数量.

image想增加一行. 汇总一下这前五的信息. 于是, 我们写一个计算列.如下

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

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

得到

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

image

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

image

加一个有趣的东西imageimage

 

 

AVG函数.

image这样一个简单的东西. 每年的销售额的订单数. 现在我们需要当年的月平均销售额.

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

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

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

image这是查询出来了每一年的销售额. 好无聊的操作. 呵呵.

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

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

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

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

得到image

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

比如这样写.

 
  
 
  
 
  
 
  
 
  
 
 
这样限定了. 月份的成员是属于在行的当前的区域范围内. 结果果然是正确得到了和使用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]
;

一个很神奇的东西

image

转载于:https://www.cnblogs.com/jianjialin/archive/2012/09/19/2694108.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值