mdx 聚合函数
聚合函數(shù)Aggregation(set_express, numeric_express), Aggregation(http://msdn.microsoft.com/zh-cn/library/ms145524.aspx)執(zhí)行求和函數(shù), 如果和某些其他求和函數(shù)配合的話, 會(huì)有變化. 看一個(gè)例子
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]很簡(jiǎn)單. 按銷售量排序排名前五的銷售小類別的三個(gè)值的表現(xiàn). 第一個(gè)是金額, 是sum, 第二個(gè)是交易數(shù)量, 是count(*), 第三個(gè)是distinctCount(*), 訂單數(shù)量.
想增加一行. 匯總一下這前五的信息. 于是, 我們寫一個(gè)計(jì)算列.如下
因?yàn)槭翘砑右恍? 那么肯定是用類似于上面的元組+元組. 所以計(jì)算列是屬于[Product].[Subcategory].元組的. 定義如下
with member [Product].[Subcategory].[top5] as sum( topcount([Product].[Subcategory].[Subcategory].Members, 5, [Measures].[Reseller Sales Amount] ) ,[Measures].[Reseller Sales Amount] )得到
哦, 錯(cuò)了. 這只是得到是Sales Amount一個(gè)死的Sum值. 在這里我們忽視了一個(gè)東西, CurrentMember, 類似于游標(biāo)指針?biāo)频囊粋€(gè)玩意. 它不僅是用在Measures被Dim打亂上(列上被行的打亂), 還可以用在Dim在不同的Measures上的表現(xiàn), (行被列限定. ).? 在這里, colomn上的measures有三個(gè)成員. 因此可以用
這樣得到的結(jié)果是可是最后一個(gè)值的5026明顯不是distinctCount, 而是一個(gè)簡(jiǎn)單是sum運(yùn)算. 這違背了我們的初衷. 這個(gè)時(shí)候, 就不能使用簡(jiǎn)單是sum聚合了. 需要保持原來聚合的Aggregation函數(shù). 最終結(jié)果如下
加一個(gè)有趣的東西
?
?
AVG函數(shù).
這樣一個(gè)簡(jiǎn)單的東西. 每年的銷售額的訂單數(shù). 現(xiàn)在我們需要當(dāng)年的月平均銷售額.
下面我們?cè)賮韽?fù)習(xí)一下作用域的概念.
with member Measures.MonthValue as avg( [Measures].[Reseller Sales Amount] )現(xiàn)在是這樣. 沒有限定任何作用域. 那么這個(gè)度量值將會(huì)被行維度給打散. 結(jié)果如圖.
這是查詢出來了每一年的銷售額. 好無聊的操作. 呵呵.
假設(shè)給avg第一個(gè)參數(shù)賦值, set_express 設(shè)置為
with member Measures.MonthValue as avg( [Date].[Calendar].[Month].members , [Measures].[Reseller Sales Amount] ) 相當(dāng)于得到一個(gè)死的值. 已經(jīng)計(jì)算完的.? 這個(gè)值是所有的月份的銷售額之和/月數(shù)., 其實(shí)我們需要這個(gè)值和每個(gè)年份做關(guān)聯(lián), 被打散. 這個(gè)時(shí)候, 就需要existing關(guān)鍵字出馬了.
existing強(qiáng)制在當(dāng)前的區(qū)域內(nèi)做運(yùn)算. 理解為, 度量值強(qiáng)制在當(dāng)前的區(qū)域內(nèi)被切割.
得到
這個(gè)時(shí)候, 突然想到. 其實(shí)我們?cè)谥付ㄔ路莸臅r(shí)候, 不也是可以指定他的區(qū)域嗎?
比如這樣寫.
這樣限定了. 月份的成員是屬于在行的當(dāng)前的區(qū)域范圍內(nèi). 結(jié)果果然是正確得到了和使用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] ;一個(gè)很神奇的東西
轉(zhuǎn)載于:https://www.cnblogs.com/jianjialin/archive/2012/09/19/2694108.html
總結(jié)
- 上一篇: 精品教程--Android实战系列源码与
- 下一篇: c++学习笔记九