博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mdx 聚合函数
阅读量:5316 次
发布时间:2019-06-14

本文共 2162 字,大约阅读时间需要 7 分钟。

聚合函数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强制在当前的区域内做运算. 理解为, 度量值强制在当前的区域内被切割.

得到

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

比如这样写.

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

一个很神奇的东西

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

你可能感兴趣的文章
【BZOJ】1013 球形空间产生器
查看>>
初识smarty
查看>>
.net Repeater知识知多少
查看>>
MySQL基础操作
查看>>
求指教、。。。关于调用so文件
查看>>
LSPCI具体解释分析
查看>>
Unity手游之路<七>角色控制器
查看>>
StringBuffer和StringBuilder使用方法比較
查看>>
Keras 获取中间某一层输出
查看>>
SDNU 1217 CD收藏——并查集
查看>>
NYOJ746 整数划分
查看>>
在ubuntu 16.04里使用python—scrapy将爬取到的数据存到mysql数据库中的一些随笔
查看>>
PAT-1057 Stack (树状数组 + 二分查找)
查看>>
PAT-1056 Mice and Rice (分组决胜问题)
查看>>
Ext4.2文件目录及页面默认导入文件
查看>>
GCD
查看>>
配置mysql为主主复制步骤
查看>>
监听键盘弹出高度
查看>>
<<Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法>>笔记-协议与分类...
查看>>
jQuery.ajax实现根据不同的Content-Type做出不同的响应
查看>>