爲了知足業務管理和決策的報表系統(包括傳統報表、數據倉庫、OLAP等)也被建立出來,企業主管經過報表瞭解企業的整體運行狀態。
可是,隨着企業間競爭的加重和市場節奏的進一步加快,企業的平常管理須要對關鍵業務指標的更加實時的監控和反饋。好比:製造業須要更及時的倉庫調度、金融業須要更實時的風險防範、電信業須要更及時的服務指標監控。因而,愈來愈多的企業提出實時企業的要求,傳統的ERP等信息系統和報表系統沒法知足這些需求。實時業務監控解決方案旨在更好支撐客戶此類需求。
http://www.tuicool.com/articl...
當今的數據處理大體能夠分紅兩大類:聯機事務處理OLTP(on-line transaction processing)、聯機分析處理OLAP(On-Line Analytical Processing)。OLTP是傳統的關係型數據庫的主要應用,主要是基本的、平常的事務處理,例如銀行交易。OLAP是數據倉庫系統的主要應用,支持複雜的分析操做,側重決策支持,而且提供直觀易懂的查詢結果。php
OLAP技術很是多的特性,歸納起來主要有以下幾點特性:html
OLAP技術是面向分析人員、管理人員的;java
OLAP技術對數據訪問一般是隻讀的,而且一次訪問大量數據;sql
OLAP技術是面向主題的多維數據分析技術。數據庫
OLAP(On-Line Analysis Processing)在線分析處理是一種共享多維信息的快速分析技術;
OLAP利用多維數據庫技術使用戶從不一樣角度觀察數據;OLAP用於支持複雜的分析操做,側重於對管理人員的決策支持,能夠知足分析人員快速、靈活地進行大數據復量的複雜查詢的要求,而且以一種直觀、易懂的形式呈現查詢結果,輔助決策。
上面是OLAP的一些不一樣的解釋,本文將從如下幾個方面介紹OLAP。express
http://www.huqiwen.com/2012/0...
Cube立方體的概念:數組
在Bi領域,cube是一個很是重要的概念,是多維立方體的簡稱,主要是用於支持聯機分析應用(OLAP),爲企業決策提供支持。Cube就像一個座標系,每個Dimension表明一個座標系,要想獲得一個一個點,就必須在每個座標軸上取得一個值,而這個點就是Cube中的Cell。
Cube是聯機分析的關鍵。他們是一種多維結構,包含原始事實數據、聚合數據,這些數據聚合容許用戶快速進行復雜的查詢,Mdx語言就應用它更是如魚得水。
Cube包含兩個基本概念:維度和度量緩存
維度(Dimension):維度提供了分類描述,表示一類分析角度,用戶經過維度分析度量數據。好比上圖中的三個維度:時間、產品、地域性能優化
度量(Measures):度量表示用來聚合分析的數字信息,度量的集合組合成了一個特殊的維度。如數量、銷售額等。服務器
級別(Level):一個維度上能夠包含的層次結構,表示特定的分類。如上圖中地域維度能夠包含的級別層次級:國家、省、市;時間維度包含的級別層次包含:年、季度、月、日等。
成員,是最重要的概念之一,一個成員是維度(包括度量<Measures>)上的項目值。如上圖時間維度上」年「級別的成員就包含:2000,2001,2002,2003...月成員包含:一、二、3等。
計算成員,是一種運行經過特殊表示式動態計算的成員。也就造成了度量(Measures)的結果。計算成員不影響現有的Cube數據,它基於cube數據,經過各類數學表達式和各類函數定義,能夠建立複雜的表達式。任何動態分析功能,均可以經過計算成員實現,好比實現佔比,同期比等等。
維度的概念
例如一個維度(Dimension):Region
該維度下有四個級別(Levels):country、province、city、county,他們屬於層次集合(Hierarchy)
經過維度和級別咱們能夠定義一個元素(Member)如:
Region.Levels(1).members(2)=china
Region.Levels(2).members(3)=shanghai
http://www.cnblogs.com/zhijia...
2、 OLAP的基本概念
(1)度量、指標)
是數據度量的指標,是數據的實際意義,即描述數據「是什麼」。像上面示例中的人數。
(2)維度
維度是描述與業務主題相關的一組屬性,單個屬性或屬性集合能夠構成一個維。如上面示例中的學歷、民族、性別等都是維度。
(3)維的層次
一個維每每能夠具備多個層次,例如時間維度分爲年、季度、月和日等層次,地區維能夠是國家、地區、省、市等層次。這裏的層次表示數據細化程度,對應概念分層。後面介紹的上鑽操做就是由低層概念映射到高層概念。概念分層可除根據概念的全序和偏序關係肯定外,還能夠經過對數據進行離散化和分組實現。
(4)維的成員
若維是多層次的,則不一樣的層次的取值構成一個維成員。部分維層次一樣能夠構成維成員,例如「某年某季度」、「某季某月」等均可以是時間維的成員。
(5)多維數組
多維數組用維和度量的組合表示。一個多維數組能夠表示爲(維1,維2,……,維n,變量),例如(部門,職系、民族、性別,人數)組成一個多維數組。
(6)數據單元(單元格)
多維數組的取值。當多維數組中每一個維都有肯定的取值時,就惟一肯定一個變量的值。數據單元能夠表示爲(維1成員,維2成員,……,維N成員,變量的值),例如(人事教育部,技能,回族,男,1人)表示一個數據單元,表示人事教育部職系是技能的回族男性有1人。
(7)事實
事實是不一樣維度在某一取值下的度量,例如上述人事教育部職系是技能的回族男性有1人就表示在部門、職系、民族、性別四個維度上企業人數的事實度量,而且在爲人數事實中包含部門維度人事教育部這一個維度層次,若是將人數事實的全部維度考慮在內,就構成有關人數的多維分析立方體。
3、 OLAP的特色
電子數據表與OLAP相比,不具有OLAP的多維性、層次、維度計算以及結構與視圖分離等特色。
多維。維是OLAP的核心概念,多維性是OLAP的關鍵屬性,這與數據倉庫的多維數據組織正好相互補充。爲了使用戶可以從多個維度、多個數據粒度查看數據,瞭解數據蘊含的信息,
系統須要提供對數據的多維分析功能,包括切片、旋轉和鑽取等多種操做
4、 OLAP的操做
OLAP比較經常使用的操做包括對多維數據的切片與切塊、上鑽(drill-up)與下鑽(drill-down)如下旋轉(rotate)等。此外,OLAP還能對多維數據進行深加工。
OALP的這些操做使用戶可以從多個視角觀察數據,並以圖形、報表等多種形式展現,從而獲取隱藏在數據中的信息。
(1)切片與切塊。
選定多維數組的一個維成員作數據分割的操做稱爲該維上的一個切片。一般把多維數組中選定一個二維子集的操做視爲切片,假設選定的維i上的某個維成員Vi,則此多維數組子集能夠定義爲(維V1……,維Vi,維N,變量)。當某維只取一個維成員時,便獲得一個切片,而切塊則是某一維取值範圍下的多個切片的疊合。經過對數據立方體的切片或切塊分割,能夠從不一樣的視角獲得各類數據。
(2)鑽取
鑽取包括上鑽和下鑽。爭取可以幫助用戶得到更多的細節性數據,逐層的分析問題的所在和緣由。
上鑽又稱爲上卷(roll-up)。上鑽操做是指經過一個維的概念分層向上攀升或者經過維歸約在數據立方體上進行數據彙總。例如在上面的示例中,能夠按學歷彙總數據,如把各類學歷的都歸約爲全部學歷,即可以獲得沿學歷維上鑽的數據彙總。
下鑽是上鑽的逆操做,經過對某一彙總數據進行維層次的細分(沿維的概念分層向下)分析數據。下鑽使用用戶對數據可以得到更深刻的瞭解,更容易發現問題本質,從而作出正確的決策。
鑽取使用戶不會再被海量的數據搞得暈頭轉向:上鑽讓用戶站在更高層次觀察數據,下鑽則能夠細化到用戶所判決的詳細數據。鑽取的嘗試與維度與維所劃分的層次相對應,根據用戶關心的數據粒度合理劃分。
(3)旋轉
旋轉又稱轉軸,是一種視圖操做,經過旋轉變換一個報告或頁面顯示的維度方向,在表格中從新安排維的位置,例如行列轉換。這種對立方體的重定位能夠獲得不一樣視角的信息。
(4)其餘OLAP操做
除以上經常使用多維操做外,還有其餘多維操做。
鑽過(drill-across)。鑽過操做涉及多個事實表的查詢並把結果合併爲單個數據集,一個典型的例子就是預測數據與當前數據的結合:一般預測數據與當前數據存在於不一樣的表中,當用戶比較預測銷售與當月銷售時,須要跨多個事實表查詢。
鑽透(drill-through)。鑽透使用關係SQL,查詢數據立方體的底層,一直到後羰的關係表。
5、 OLAP的分類
OLAP分類
按處理方式分類
Server OLAP:絕大多數的OLAP系統都屬於此類,Server OLAP在服務端的數據庫上創建多維數據立方體,由服務端提供多維分析,並把最終結果呈現給用戶
Client OLAP:所相關立方體數據下載一本地,由本地爲用戶提供多維分析,從而保證在網絡故障時仍然能正常工做。
按存儲方式分類
ROLAP。ROLAP使用關係數據庫或擴充關係數據庫(XRDBMS)存儲管理數據倉庫,以關係表存儲多維數據,有較強的可伸縮性。其中維數據存儲在維表中,而事實數據和維ID則存儲在事實表中,維表和事實表經過主外鍵關聯。
MOLAP。MOLAP支持數據的多維視圖,採用多維數據組存儲數據,它把維映射到多維數組的下標或下標的範圍,而事實數據存儲在數組單元中,從而實現了多維視圖到數組的映射,造成了立方體的結構。大容量的數據使立方體稀疏化,此時須要稀疏矩陣壓縮技術處理,因爲MOLAP是從物理上實現,故又稱爲物理OLAP(Physical OLAP)。
DOLAP。DOLAP是屬於單層架構,它是基於桌面的客戶端OLAP,主要特色是由服務器生成請求數據相關的立方體並下載到本地,由本地提供數據結構與報表格式重組,爲用戶提供多維分析,此時無需任何的網絡鏈接,靈活的存儲方式方便了移動用戶的需求,但支持數據有限,使用範圍有限。
~/Desktop/Mondrian數據分析學習.pdf
http://mondrian.pentaho.com/d...
http://www.cnblogs.com/panfen...
在Mondrian裏面的cube是以XML的形式定義的。(MDX)
Mondrian自己是不存儲數據的,經過MDX語句(一個相似於SQL的查詢語言)來獲取數據,Mondrian 運行的時候要連數據庫,而且還要有一個數據模型配置文件(Mondrian叫schema),其實就是一個取數據的規則;由此可知Mondrian只不過是把MDX 翻譯成了SQL而後從數據庫中把數據拿出來給用戶
Mondrian是一個開放源代碼的Rolap服務器,使用java開發的。它實現了xmla和jolap規範,並且自定義了一種使用mdx語言的客戶端接口。Mondrian是olap服務器,而不是數據倉庫服務器,所以Mondrian的元數據主要包括olap建模的元數據,不包括從外部數據源到數據庫轉換的元數據。也就是說Mondria的元數據僅僅包括了多維邏輯模型,從關係型數據庫到多維邏輯模型的映射,存取權限等信息。在功能上,Mondrian支持共享維和成員計算,支持星型模型和雪花模型的功能。
Mondrian 是一個開源項目,是開源項目Pentaho的一部分,是一個用Java寫成的OLAP引擎。它實現了MDX語言、XML解析、JOLAP規範。
它從RDBMS和其它數據源讀取數據並把數據彙集在內存緩存中,而後通過Java API用多維的方式對結果進行展現,同時能夠不寫SQL就能分析存儲於SQL 數據庫的龐大數據集,能夠封裝JDBC數據源並把數據以多維的方式展示出來。
總體的項目架構,四個大部分Schema manager、Session Manager、Dimension Manager、Aggregate Manager
Schema Manager:與初始化緊密相關。主要是一些重要的數據結構如緩存池的構建以及多維模型的生成。
Session Manager:最爲重要的一個部分。接受MDX查詢、解析MDX,返回結果。
Aggregate Manager:實現了對彙集表的管理。主要是對OLAP緩存的管理,屬於性能優化的部分。
Dimension Manager:維度的管理。實現多維模型中維度和關係數據庫表中列的映射,在Schema Manager也有部分功能處理這些映射。
Mondrian經過Schema來定義一個多維數據庫,它是一個邏輯概念上的模型,其中包含Cube(立方體)、Dimension(維度)、Hierarchy(層次)、Level(級別)、Measure(度量),這些被映射到數據庫物理模型。Mondrian中Schema是以XML文件的形式定義的。
Cube(立方體)由維度構建出來的多維空間,是一系列Dimension和Measure的集合區域,它們共用一個事實表。
Dimension(維度)觀察數據的一種角度,維度能夠理解爲立方體的一個軸。是一個Hierarchy的集合,維度通常有其相對應的維度表,它由Hierarchy(層次)組成,而Hierarchy(層次)又是由組成Level(級別)的。
Hierarchy(層次)是指定維度的層級關係的,若是沒有指定,默認Hierarchy裏面裝的是來自立方體中的真實表。
Level(級別)是Hierarchy的組成部分,使用它能夠構成一個結構樹,Level的前後順序決定了Level在結構樹上的位置,最頂層的 Level 位於樹的第一級,依次類推。
Measure(度量)是咱們要進行度量計算的數值,支持的操做有sum、count、avg、distinct-count、max、min等。
在多維分析中,關注的內容一般被稱爲度量(Measure),而把限制條件稱爲維度(Dimension)。
多維分析就是對同時知足多種限制條件的全部度量值作彙總統計。包含度量值的表被稱爲事實表(Fact Table),描述維度具體信息的表被稱爲維表(Dimension Table)
立方體:由維度構建出來的多維空間,包含了全部要分析的基礎數據,全部的聚合數據操做都在立方體上進行。
維度:就是觀察數據的一種角度。在這個例子中,路線,源,時間都是維度,
維度成員:構成維度的基本單位。對於時間維,例如它的成員分別是:第一季度、第二季度、第三季度、第四季度。
層次:維度的層次結構,要注意的是存在兩種層次:天然層次和用戶自定義層次。對於時間維而言,(年、月、日)是它的一個層次,(年、季度、月)是它的另外一個層次,一個維能夠有多個層次,層次能夠理解爲單位數據聚合的一種路徑。
級別:級別組成層次。對於時間維的一個層次(年、月、日)而言,年是一個級別,月是一個級別,日是一個級別,顯然這些級別是有父子關係的。
度量值:要分析展現的數據,即指標。如圖1中一個cell中包含了兩個度量值:裝箱數和截至時間,能夠對其進行多維分析。
事實表:存放度量值的表,同時存放了維表的外鍵。全部的分析用的數據最終都是來自與事實表。
維表:一個維度對應一個或者多個維表。一個維度對應一個維表時數據的組織方式就是採用的星型模式,對應多個維表時就是採用雪花模式。雪花模式是對星型模式的規範化。簡言之,維表是對維度的描述。
MDX查詢:多維模型的查詢語言MDX(MDX是微軟發佈的多維查詢語言標準),它的語法與SQL有不少類似之處:select {[Measures].[Salary]} on columns, {[Employee].[employeeId].members} on rows from CubeTest對於這條語句,COLUMNS 和 ROWS都表明查詢軸,其中COLUMNS表明列軸,ROWS表明行軸。COLUMNS又能夠寫成0,ROWS又能夠寫成1,當只有兩個查詢軸時,能夠理解爲結果的展示格式是一個平坦二維表。這條語句的含義就是查詢名字爲CubeTest的立方體,列顯示Measures維度的salary,行顯示 Employee維度employeeId級別的全部成員,那麼得出的結果就是employeeId全部成員的salary,也就是全部員工的薪酬。具體語法規範和幫助文檔能夠參考微軟的用戶文檔。
百萬級事實數據:按照Mondrian文檔中所描述的內容能夠看出,只基於操做系統環境和數據庫環境的優化,Mondrian Server在百萬行級別數據量的事實表(關係數據庫)仍可以運行良好。固然這須要咱們本身來評測和證明。
千萬級事實數據:當事實表數據立方體的數據量達到千萬行以上時,Mondrian建議採用「彙總表」或者是由數據庫支持的相似Oracle數據庫的「物化視圖」功能來優化OLAP查詢的性能。
Mondrian緩存設置:因爲Mondrian會將查詢過的數據緩存起來,因此Mondrian建議緩存的大小根據具體項目的實際狀況判斷,固然是緩存越大越好
爲了提升海量數據下的查詢響應速度,Mondrian自動將首次查詢的結果緩存到內存中,以後的查詢若是命中緩存內容,則再也不訪問數據庫。這種實現方式有點自沒必要說,
可是在實現實時OLAP時會存在問題,實時OLAP中數據變化頻繁致使緩存中的數據不是最新的。
緩存控制接口:爲了作到不重啓OLAP Server也能更新緩存,Mondrian提供了一系列的刷新緩存的接口,支持指定清除指定schema的元數據緩存、查詢結果緩存;清除動做能夠是所有清除 也能夠是 部分清除(能夠指定清除某個維度下某級別成員的相關內容)。
數據變化監聽: Mondrian提供了緩存控制接口(被動響應),但對於實現咱們的目標「實時OLAP」來講咱們就須要本身實現一個數據變動監聽的模塊,來監聽數據變化,一旦數據有變化就發起變動事件,更新Mondrian引擎的緩存。目前初步考慮實現方案爲ETL工具在數據處理結束後通知OLAP引擎。引擎收到數據變動通知後作清理緩存的動做。
Jpivot:簡單說是一個展現工具,有人說是個標籤庫,相似於struts。只是用來顯示mondrian傳來的xml數據,將其渲染成咱們熟悉的html。對於層次性很強的報表,XML渲染的確有他的魅力,免去了繁雜的js痛苦。總之mondrian是用來研究和提取數據,jpivot是用來顯示數據。至於jpivit是如何顯示數據,主要是經過xls+xml。 Jpivot自己的界面是很難看的。
Pentaho、Saiku、Jpivot都用到了Mondrian作爲其多維數據處理的服務器,網上的不少關於Mondrian的文章也都是以Jpivot來進行分析的,
不過Jpivot已經被拋棄了做者也再也不更新了,而且Jpivot只能支持到Mondrian3.5 因此對於新版本的Mondrian必定是不能用Jpivot了(不過Jpivot有一個替代品Pivot4j這個還在持續維護),
這裏仍是推薦你們用Saiku或者Pivot4j
若是咱們不想用Saiku、pivot4j 這樣現成的東西(畢竟有不少東西咱們用不到)那麼能夠把Mondrian 集成到咱們本身的應用中去
http://mondrian.pentaho.com/d...
personDemo.xml
<?xml version="1.0" encoding="UTF-8"?> <Schema name="Mondrian"> <!--模型定義--> <Cube name="Person"> <!--立方體 ,一個立方體有多個維度--> <Table name="PERSON" /> <!--立方體對應的表 --> <Dimension name="部門" foreignKey="USERID" > <!--定義維度 --> <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="全部部門" > <!--定義維度下面的層次,層次包含不少層 --> <Table name="PERSON" alias="a"/> <!--定義維度獲取數據的來源-表 --> <Level name="部門" column="DEPARTMENT" uniqueMembers="true" /> <!--定義層次的層,每一個層對應數據庫中對應的字段 --> <Level name="姓名" column="USERNAME" uniqueMembers="true" /> </Hierarchy> </Dimension> <Dimension name="性別" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="全部性別"> <Table name="PERSON" alias="b" /> <Level name="性別" column="SEX" uniqueMembers="true" /> </Hierarchy> </Dimension> <Dimension name="專業技術資格類別" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="全部專業技術資格類別"> <Table name="PERSON" alias="c" /> <Level name="資格類別" column="ZYJSLB" uniqueMembers="true" /> </Hierarchy> </Dimension> <Dimension name="專業技術資格等級" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="全部專業技術資格等級"> <Table name="PERSON" alias="d" /> <Level name="資格等級" column="ZYJSDJ" uniqueMembers="true" /> </Hierarchy> </Dimension> <Dimension name="職系" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="全部職系"> <Table name="PERSON" alias="e" /> <Level name="職系" column="ZHIXI" uniqueMembers="true" /> </Hierarchy> </Dimension> <Dimension name="民族" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="全部民族"> <Table name="PERSON" alias="f" /> <Level name="民族" column="NATIONALITY" uniqueMembers="true" /> </Hierarchy> </Dimension> <Dimension name="學歷" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="全部學歷"> <Table name="PERSON" alias="g" /> <Level name="學歷" column="XUELI" uniqueMembers="true" /> </Hierarchy> </Dimension> <Measure name="人數" column="USERID" aggregator="distinct count" /> <!--指標/度量,採用distinct count聚合 --> </Cube> </Schema>
對應表:
CREATE TABLE `person` ( `userid` varchar(100) , `department` varchar(100) , `username` varchar(100), `sex` varchar(100) , `nationality` varchar(100), `post` varchar(100), `zyjslb` varchar(100), `zyjsdj` varchar(100) , `zhixi` varchar(100), `xueli` varchar(100) , `age` int(10) , PRIMARY KEY (`userid`) )
MDX查詢語句:select NON EMPTY {[Measures].[人數]} on columns, NON EMPTY {([部門].[全部部門], [職系].[全部職系], [專業技術資格類別].[全部專業技術資格類別], [專業技術資格等級].[全部專業技術資格等級], [學歷].[全部學歷], [民族].[全部民族], [性別].[全部性別])} ON rows from Person
http://www.biaodianfu.com/ola...
Schema
Schema 定義了一個多維數據庫。包含了一個邏輯模型,而這個邏輯模型的目的是爲了書寫 MDX 語言的查詢語句。這個邏輯模型實際上提供了這幾個概念:
Cubes: 立方體
Dimensions: 維度
Hierarchies: 層次
Levels: 級別
Members: 成員
而一個schema 文件就是編輯這個 schema 的一個xml 文件。在這個文件中造成邏輯模型和數據庫物理模型的對應。
Cube
一個 Cube 是一系列維度 (Dimension) 和度量 (Measure) 的集合區域。在 Cube 中, Dimension 和 Measure 的共同地方就是共用一個事實表。 Cube 中的有如下幾個屬性:
name: Cube 的名字。
caption: 標題 , 在表示層顯示的。
cache: 是否對 Cube 對應的實表用 mondrian 進行存儲 , 默認爲 true。
enabled: 是布爾型的 , 若是是被激活 ,Cubes 就執行 , 不然就不予理睬,默認爲 true。
Cube 裏面有一個全局的標籤訂義了所用的事實表的表名。
Dimension
他是一個層次( Hierarchies )的集合 , 維度通常有其相對應的維度表 . 他的組成是由層次(Hierarchies)而層次(Hierarchies)又是有級別(Level)組成 . 其屬性以下:
name: Dimension 的名稱。
type: 類型,有兩個可選的類型: StandarDimension 和 TimeDimension ,默認爲StandardDimension。
caption: 標題 , 在表示層顯示的UsagePrefix加前綴 , 消除歧義。
foreignKey: 外鍵,對應事實表中的一個列,它經過 <Hierarchy> 元素中的主鍵屬性鏈接起來。
Hierarchy
你必定要指定其中的各類關係,若是沒有指定,就默認 Hierarchy 裏面裝的是來自立方體中的真實表 . 屬性以下:
name: Hierarchy 的名稱,該值能夠爲空,爲空時表示 Hirearchy 的名字和 Dimension 的名字相同。當一個 Dimension 有多個 Hierarchy時,注意 name 值要惟一。
hasAll: 布爾型的 , 決定是否包含所有的成員 member。
allMemberName: 全部成員的名字 , 也就是總的標題 , 例如: allMemberName= 「所有產品」。
allLevelName: 全部級別的名字,它會覆蓋其下全部的 Member 的 name 和全部的 Level 的 name 屬性的值。
allMemberCaption: 例如 : allMemberCaption= 「所有產品」這個是在表示層顯示的內容。
PrimaryKey: 經過主鍵來肯定成員,該主鍵指的是成員表中的主鍵,該主鍵同時要與 Dimension 裏設置的 foreignKey 屬性對應的字段造成外鍵對應關係。
primaryKeyTable: 若是成員表不僅一個,而是多個表經過 join 關係造成的,那麼就要經過這個屬性來指明 join 的這些表中,哪個與Dimension 裏設置的foreignKey 屬性造成外鍵關係。經過該屬性來指明主表。
caption: 標題 , 在表示層顯示的。
defaultMember
memberReaderClass 設定一個成員讀取器,默認狀況下 Hierarchy 都是從關係型數據庫裏讀取的,若是你的數據不在 RDBMS 裏面的話,你能夠經過自定義一個member reader 來表現一個 Hierarchy 。
Level
級別 , 他是組成 Hierarchy 的部分。屬性不少,而且是 schema 編寫的關鍵,使用它能夠構成一個結構樹, Level 的前後順序決定了 Level在這棵樹上的的位置,最頂層的 Level 位於樹的第一級,依次類推。 Level 的屬性以下:
name: 名稱
table: 該 Level 要使用的表名
column: 用上面指定的表中某一列做爲該 Level 的關鍵字
nameColumn: 用來顯示的時候使用,若是不定義,那麼就採用上面的 column 的值來進行顯示。
oridinalColumn: 定義該 Level 上的成員的顯示順序,若是不指定,那麼採用 column 的值。
parentColumn: 在一個有父 – 子關係的 Hierarchy 當中,當前 Level 引用的是其父成員的列名。比如是一張部門表,在一張表裏表現部門的上下級關係,一個是主鍵,確定還有一個字段爲鏈接到該主鍵的外鍵的列名,這裏的 parentColumn 指的就是這個列名。
nullParentValue: 若是當前的 Level 是有上下級關係(設置了 parentColumn 屬性),若是該 Level 又處於頂級,咱們須要將頂級的數據取出來,這裏指的是位於頂級的父成員的值,有些數據庫不支持 null, 那麼也可使用0或-1 等,這就表示頂級的成員的父 ID 爲0 或爲-1 。
type: 數據類型,默認值爲 string 。固然還能夠是 Numeric 、 Integer 、 Boolean 、 Date 等。
uniqueMembers: 該屬性用於優化產生的 SQL ,若是你知道這個級別和其父級別交叉後的值或者是維度表中給定的級別全部的值是惟一的,那麼就能夠設置該值爲 true ,不然爲 false 。
levelType: 該 Level 的類型,默認爲 regular (正常的),若是你在其 Dimension 屬性 type 裏選擇了 TimeDimension 那麼這裏就能夠選擇 TimeYears 、 TimeQuarters 、 TimeMonth 、 TimeWeeds 、 TimeDays 。
hideMemberIf: 在何時不隱藏該成員,可選的值有三個: Never 、 IfBlankName 、 IfParentName
approxRowCount: 該屬性能夠用來提升性能,能夠經過指定一個數值以減小判斷級別、層次、維度基數的時間,該屬性在經過使用 XMLA 鏈接Mondrian 頗有用處。
caption: 標題 , 在表示層顯示的。
captionColumn: 用來顯示標題的列。
formatter: 該屬性定義了 Member.getCaption() 方法返回的動做值,這裏須要是一個實現了 mondrian.olap.MemberFormatter 接口的類,用來對Caption地值進行格式化。
Join
對於一個 Hierarchy 來講,有兩種方式爲其指定:一種是直接經過一個 Table 標籤指定;一種是經過 Join 將若干張錶鏈接起來指定。一旦採用 Join 的話,那麼就要在 Hierarchy 裏的 primaryKeyTable 屬性指定主表。
Measure
Measure 就是咱們要計算的數值,操做的核心。它的屬性以下:
name: 名稱。
aggregator: 要採用的計算函數。
column: 要計算的列名。
formatString: 計算結果的顯示格式。
visible: 是否可見。
datatype: 數據類型,默認爲 Numeric
formatter: 採用類來對該 Measure 的值進行格式,具體參考 Level 的 formatter 屬性。
caption: 標題,用來顯示時使用。
歸納總結一下:在多維分析中,關注的內容一般被稱爲度量(Measure),而把限制條件稱爲維度(Dimension)。多維分析就是對同時知足多種限制條件的全部度量值作彙總統計。包含度量值的表被稱爲事實表(Fact Table),描述維度具體信息的表被稱爲維表(Dimension Table),同時有一點須要注意:並非全部的維度都要有維表,對於取值簡單的維度,能夠直接使用事實表中的一列做爲維度展現。
下描述了一個數據庫的結構。該數據庫中共有五張表,分別是Sales表,Customer表,Time表,Product表和Mfr表。這個數據庫的做用是存儲每一筆交易:包括這筆交易發生在什麼時間,交易的產品類型,進行交易的客戶信息,交易方式,交易了多少件產品以及成交金額是多少。
模型中有一張事實表(Sales),兩個度量列(units和dollars),四個維度表(Product, Mfr, Customer, Time)。在這個星型模型的最頂層,咱們建立了如下多維模型:
[Sales]立方體包含[Unit sales]和[Dollar sales]兩個度量值;
[Product]維度包含[All Products],[Manufacturer],[Brand],[Prodid]四個級別;
[Time]維度包含[All Time],[Year],[Quarter],[Month],[Day]五個級別;
[Customer]維度包含[All Customers],[State],[City],[Custid]四個級別;
[Payment Method]維度包含[All Payment Methods],[Payment Method]兩個級別。
假設如今咱們要對交易作一些統計,例如,某一件特定產品在某一個時間段內以某種特定方式總共賣出多少件或多少錢,這時成交產品數和成交金額是咱們最終關注的內容,其餘的因素例如時間、產品、方式等都只是對咱們最終關注內容進行統計的限制條件。
在上面的例子中,限制條件有時間、產品類型、用戶類型和交易方式,
有時咱們並不須要同時使用全部的限制條件,例如,當咱們只想知道指定產品的成交總金額時,那麼除了產品類型以外其餘三個限制條件都是多餘的,而在查詢時,須要在整個事實表中執行查詢,找出產品類型爲指定類型的全部產品而後再作統計,爲了提升查詢效率,咱們能夠新建一張表,這張表按照產品類型把事實表中的行合併到一塊兒,合併的方式是拋棄其餘維,把度量值按特定的方式(max,min,sum,count或avg)整合到一塊兒。這種表被叫作聚合表(Aggregate Table)。
聚合表的應用場景
事實表中的行構成了一個集合,每一維(或若干維)按照其取值的不一樣能夠將事實表這個全集劃分紅若干個不相交的子集。聚合表所作的工做實際上就是把劃分出的子集歸爲數據庫表中的一行,這樣作一方面能夠減小數據庫表的行數,另外一方面也省去了查詢時所須要作的一些統計工做,從而提升查詢時的效率。
使用Mondrian作大數據量(如>100W行)的OLAP分析時,考慮是否可使用聚合表進行優化。
然而Mondrian的優化方式又不限於聚合表這一種,是否要進行聚合表優化,要根據實際狀況來決定。
Mondrian目前並不提供對聚合表的數據同步機制,若是要作實時OLAP,須要本身實現聚合表和事實表中的數據同步。
聚合表的定義見:http://www.cnblogs.com/panfen...
http://sourceforge.net/projec...
http://blog.csdn.net/athenaer...
其餘參考:http://blog.csdn.net/zhangzho...
http://blog.csdn.net/xiaolang...
http://wushexu.iteye.com/blog...
MDX(Multidimensional Expressions)是多維 數據庫(OLAP 數據庫)的查詢語言.
Mondrian是java中的一個OLAP與MDX解析引擎,它會解析MDX,轉換成SQL來查詢關係數據庫(多是多條查詢)。
MDX 的內容不少,功能強大,這裏只介紹最基礎和最重要的部分。
如下是裏兩條MDX 查詢語句及其查詢結果
語句1:
SELECT { [Measures].[Dollar Sales], [Measures].[Unit Sales] } on columns, { [Time].[Q1, 2005], [Time].[Q2, 2005] } on rows FROM [Sales] WHERE ([Customer].[MA])
語句 2
SELECT { [Time].[Q1, 2005], [Time].[Q2, 2005], [Time].[Q3, 2005] } on columns, { [Customer].[MA], [Customer].[CT] } on rows FROM Sales WHERE ( [Measures].[Dollar Sales] )
第一條語句查詢對[Customer].[MA]這個客戶在 2005 年第1、第二季度的銷售額、報表期銷售額。
第二條語句查詢對[Customer].[MA], [Customer].[CT]這兩個客戶在 2005 年前三個季度的銷售額。
能夠看到,mdx 有相似 sql 的結構,一樣有 select、from、where 這三部分。但也有不少不一樣。
Select 字句指定一個集合,把它放到某個軸上。
From 字句說明要從哪一個數據立方體來查詢。
方括號([])用於維度名、層次名、維度成員名,避免名字和函數混淆(函數名
是不加方括號的)。
Where 字句指定切片,即對不出如今軸上的維度的成員的限定。
Mdx 沒有 group by 字句。其實分組是隱含的。
Mdx 沒有 order by 字句。排序只會對某個軸進行,經過使用排序函數。
和 sql 同樣,mdx 也是不區分大小寫的,而且能夠隨意分行。
Mdx 中也能夠包含註釋,除了支持 sql 的--註釋外還支持//和/ ... /註釋。
用 on {axis}語法來把維度分配到軸(Axis,複數 Axes)上,一個查詢能夠有多個軸。
不一樣軸用逗號分隔,分配的順序是不要緊的。但若是把軸調換(如 A on columns, B on rows 改爲 A on rows, B on columns),結果的行和列也會轉置過來。
軸用 axis(0),axis(1),axis(2)...表示,前五個軸可使用別名 Columns,Rows,Pages,Chapters,Sections。所以 on Columns 等價於 on axis(0)。超過 5 個軸時只能用 axis(5),axis(6)...來表示(極少會須要這麼多的軸)。
不少實現(包括 Mondrian)支持僅用數字表示軸,所以 on Columns 能夠寫成 on 0。axis(0)和別名表示能夠混用,例以下面語句是能夠的:
SELECT { [Time].[Q1, 2005], [Time].[Q2, 2005] } on axis(0), { [Customer].[MA], [Customer].[CT] } on rows FROM Sales
軸必須從 0 開始,而且連續,不能跳過。下面的是不能夠的:
SELECT { [Time].[Q1, 2005], [Time].[Q2, 2005] } on rows, { [Customer].[MA], [Customer].[CT] } on pages FROM Sales
錯誤,跳過了軸 axis(0)(columns) 。
在大多查詢中,軸通常是兩個。一個軸也能夠,甚至 0 個軸。
若是軸多於兩個,就無法在平面上表示。若是維度多於兩個,須要把多個維度(交叉後)放到一個軸上。
切片(Slice)維度就是出如今 MDX 語句 WHERE 子句中的維度,跟 SQL 同樣,表示對數據集的限制。例如 MDX 語句:
SELECT
{[Product].[All Products].[Food], [Product].[All Products].[Drink]} ON COLUMNS
FROM [Sales]
WHERE [Time].[Year].[2005]
限制了查詢的數據範圍,只限於 2005 年。語法和 SQL 不同,[Time].[Year].[2005](是一個元組)自己就表示了一個條件。這能夠當作對數據立方體從某個方向進行切片(從 Time維度的方向)獲得一個子立方體,所以叫切片。
切片維度不會出如今軸上。上面的時間維度不會出如今軸上。
一個維度不能同時出如今軸維度(SELECT 的維度)和切片維度上。
切片器維度只可接受評估爲單個元組的表示式
若是一個維度既沒有出如今軸維度上,也沒有出如今切片維度上,就會用維度的(默認層次的)默認成員進行切片。通常維度的默認成員是「All xxx」 ,所以默認是對這個維度全部成員的數據進行彙集操做。例如:
SELECT {[Time].[Year].Members } ON COLUMNS
FROM [Sales]
Product 維度沒有出如今軸維度和切片維度上。若是 Product 的默認成員是[All Products],就會查詢全部產品的銷售額彙總,符合人的習慣。上面語句至關於:
SELECT {[Time].[Year].Members } ON COLUMNS
FROM [Sales]
WHERE [Product].[ All Products]
維度有一個函數 defaultMember 能夠返回維度的默認成員,所以也至關於:
SELECT {[Time].[Year].Members } ON COLUMNS
FROM [Sales]
WHERE [Product]. defaultMember
除了 Product 維度,其餘沒有出如今軸維度和切片維度上的維度也是同樣的。
度量維度(爲了一致能夠把度量當作一個維度:Measures 維度)是沒有」All xxx」成員的,它的默認成員能夠明確設置,若是沒設置,就是第一個度量。若是默認度量是[Store Sales],
下面的查詢
SELECT {[Time].[Year].Members } ON COLUMNS
FROM [Sales]
和
SELECT {[Time].[Year].Members } ON COLUMNS
FROM [Sales]
WHERE [Measures]. [Store Sales]
是等價的。
一個維度的默認成員、是否有 All 成員(通常都應該有),是能夠在 Schema 文件中設置的。
若是沒有明確設置默認成員,默認成員就是 All 成員,若是沒有 All 成員,默認成員就是第一個成員。
元組和集合是 MDX 中的兩種數據類型,也是 MDX 語句的構件。
元組(Tuple)就是一個或多個維度的成員的組合當一個元組有多個維度時,必須用括號括起來
([Customer].[Chicago, IL], [Time].[Jan, 2005])
一個元組能夠表明立方體的一個切片
以這種語法構造的元組能夠直接用於
SELECT
{ ( [Time].[2005], [Measures].[Dollar Sales],
( [Time].[Feb, 2005],[Measures].[Unit Sales] )
} ON COLUMNS ,
{ [Product].[Tools], [Product].[Toys]} ON ROWS
FROM [Sales]
元組不能嵌套
元組用於定義來自多維數據切片;他是由一個或多個維度的單個成員的有序集合組成。元組內不包含來自同一個維度的多個成員(能夠理解爲座標),元組用()包圍。
where 字句也是一個元組,用以指定一個數據切片
集合(Set)是零個、一個或多個元組的有序集合。不像數學上的集合,MDX 集合一個元組能夠出現屢次,並且順序是重要的。
集合最經常使用於在Mdx查詢中定義軸維度和切片器維度, 一般的指定集合的方式是把一個元組列表用花括號括起來。如{ [Customer].[MA],
[Customer].[CT] }就表示一個集合,集合裏是客戶維度的兩個成員。一個集合中的全部元組必須有一樣的維度性質,即所表示的維度及其順序。
使用下面的集合將會報錯,由於維度的順序不同:
{ ( [Time].[2005], [Measures].[Dollar Sales] ), ( [Measures].[Unit Sales], [Time].[Feb, 2005] ) }
不少函數均可以返回一個集合
要把維度成員放在軸上,能夠列舉維度的成員,例如{ [Customer].[MA], [Customer].[CT] }。也能夠經過範圍語法或一個函數獲得成員的集合。
經過座標值能夠定義出每一個成員的名稱
冒號(:)語法能夠表示成員範圍。冒號先後是同一個層次的起點和終點兩個成員。
SELECT
{ [Time].[2003] : [Time].[2008] } on columns,
{ [Product].[Drinks] : [Product].[Bread] } on rows
FROM [Sales]
時間維度表示 2003 年到 2008 年(6 個成員),產品維度表示從 Drinks 到 Bread。這一般跟排序方式有關。
集合裏能夠包含子集合。例以下面集合,包含 2001 年的前三個月跟後三個月。
{ { [Time].[January-2001] : [Time].[March-2001] } ,{ [Time].[October-2001] : [Time].[December-2001] } }
能夠用成員名稱或成員鍵引用某個成員。
&符號能夠標記出其父級中的元素集合中的值也叫作元素值,&符號用於區分紅員鍵和成員名稱。例如:
SELECT {[Dim Region].[City].&[上海],[Dim Region].[City].&[北京]} ON COLUMNS, {[Dim Time].[Day Of Month].&[13],[Dim Time].[Day OfMonth].&[14]} ON ROWS FROM [MKAS] WHERE ([Measures].[Fact Ind Count])
大多時候須要獲得一個維度、層次、層的所有成員,這個時候可使用.Members 操做(函數)。好比[Time].[Years].Members 能夠獲得全部年份。
SELECT
{ [Time].[Years].Members} ON COLUMNS,
{ [Product].[Line].Members} ON ROWS
FROM [SteelWheelsSales]
WHERE [Measures].[sales]
這個語句查詢全部年份、全部產品線的銷售額,把年份放在列上,產品線放在行上。
有時候須要獲得某個成員的下一層次的所有成員,這是須要用.Children 函數。這在下鑽操做時常常用到。
例如要獲得產品線 Classic Cars 下的全部產品,能夠這樣[Product].[Line].[Classic
Cars].Children。[Product].[Line].[Classic Cars]是 Product 維度 Line 層的一個成員。
.Children 只能獲得直接下級成員,若是須要多級,須要使用 Descendants()函數。語法是:
Descendants (member [, [ level ] [, flag]] )
Descendants 返回 member 成員下 level 層的成員,可選標誌 flag 有多個選項,以設置包含最下一層上面的哪些層的成員。
如下是一個例子,查詢 Tools 和 Toys 兩類產品在 2005 年各月的銷售額,由於年和月兩個層次中間有一個季度層次,因此不能用[Time].[2005].Children。
SELECT
{ [Product].[Tools], [Product].[Toys] } ON COLUMNS,
Descendants ([Time].[2005],[Time].[Month],SELF_AND_BEFORE) ON ROWS
FROM Sales
WHERE [Measures].[Dollar Sales]
flag 設爲 SELF_AND_BEFORE,能夠看到行上包含了 2005 年和各個季度(若是設爲SELF 則不會包含) 。
有時要獲取維度成員的屬性(維表上的某些列),這時可使用 dimemsion properties子句。dimemsion關鍵字能夠省略。
如下查詢同時獲取客戶所在地的郵編屬性
SELECT
{ [Customer].[Akron, OH].Children }
DIMENSION PROPERTIES [Customer].[Zip Code]
on columns,
{ [Product].[Category].Members } on rows
FROM Sales
WHERE ([Measures].[Units Sold], [Time].[July 3, 2005])
在多維空間,數據不少時候是稀疏的。好比:好比,不是每個產品都銷售給了全部的客戶,不是每個客戶在每一個時期都購買了產品。若是按維度全部成員交叉得出報表,就會有不少空行、空列。
要從查詢結果去掉這些空行
SELECT
{ [Time].[Jan,2005],[Time].[Feb,2005] } ON COLUMNS ,
NON EMPTY { [Product].[Toys], [Product].[Toys].Children } ON ROWS
FROM Sales
WHERE ([Measures].[Dollar Sales], [Customer].[TX])
這樣空行就去掉了。non empty 可用於任何軸上。
不少時候,咱們須要對兩個不一樣的集合進行交叉,也就是要獲得兩個集合成員的全部組合。CrossJoin()函數就是用來獲得組合的最直接方式,它的語法是 CrossJoin (set1, set2)
如下語句在每一個季度下分出兩個度量
SELECT
CrossJoin (
{ [Time].[Q1, 2005], [Time].[Q2, 2005]},
{ [Measures].[Dollar Sales], [Measures].[Unit Sales] }
) ON COLUMNS,
{ [Product].[Tools], [Product].[Toys] } ON ROWS
FROM Sales
CrossJoin 的結果是一個集合。所以支持CrossJoin 嵌套。
Filter 函數用來篩選一個集合,它以一個集合和一個 boolean 表達式爲參數
Filter (set,boolean-expression)。
例如,如下表達式會返回關聯的產品銷售額至少爲500 的產品分類的集合。
Filter (
{ [Product].[Product Category].Members },
[Measures].[Dollar Sales] >= 500
)
要求銷售額至少爲 150 而且銷售額要至少在成本的1.2 倍以上
Filter (
{ [Product].[Product Category].Members },
([Measures].[Dollar Sales] >= 1.2 *[Measures].[Dollar Costs])
AND [Measures].[Dollar Sales] >= 150
)
Order()函數用於對一個集合進行排序,語法:
Order (set1, expression[,ASC| DESC | BASC | BDESC])
SELECT
{ [Measures].[Dollar Sales] } on columns,
Order (
[Product].[Product Category].Members,
[Measures].[Dollar Sales],
BDESC
) on rows
FROM [Sales]
WHERE [Time].[2004]
在 sql 中能夠增長計算出來的列,MDX 中一樣也能夠,在 MDX 中叫計算成員(CalculatedMember)。由於MDX 操做的是多維數據,計算成員實際是給一個維度增長成員。
語法:
with
member 成員標識 as ‘表達式’ [, 屬性...]
select ...
表達式用單引號引注。
如下例子增長一個新的度量[Avg Sales Price]
WITH
MEMBER [Measures].[Avg Sales Price] AS
'[Measures].[Dollar Sales] / [Measures].[Unit Sales]'
SELECT
{ [Measures].[Dollar Sales], [Measures].[Unit Sales],
[Measures].[Avg Sales Price]
} on columns,
{ [Time].[Q1, 2005], [Time].[Q2, 2005] } on rows
FROM Sales
WHERE ([Customer].[MA])
當不止一個維度增長了計算成員時,因爲每一個維度的成員都有計算公式,在這些維度的交叉點上,就能夠有多種計算順序。這時候就不須要考慮公式優先級的問題。所以引入了 SOLVE_ORDER 屬性
WITH
MEMBER [Measures].[Avg Sales Price] AS
‘[Measures].[Dollar Sales] / [Measures].[Unit Sales]',
SOLVE_ORDER=0
MEMBER [Time].[Q1 to Q2 Growth] AS
‘[Time].[Q2, 2005]- [Time].[Q1, 2005]’,
SOLVE_ORDER=1
SELECT
{ [Measures].[Dollar Sales], [Measures].[Unit Sales],
[Measures].[Avg Sales Price]
} on columns,
{ [Time].[Q1, 2005], [Time].[Q2, 2005], [Time].[Q1 to Q2 Growth] } on rows
FROM [Sales]
WHERE ([Customer].[MA])
命名集合(Named Set)容許預先定義的一個集合,供後面的語句使用。語法和計算成員相似。
with
set 集合標識 as ‘集合表達式’
select ...
WITH
SET [User Selection] AS ‘{ [Product].[Action Figures], [Product].[Dolls] }'
MEMBER [Product].[UserTotal] AS ‘Sum ( [User Selection] )’
SELECT
{ [Time].[Jan, 2005], [Time].[Feb, 2005] } ON COLUMNS,
{ [Product].[Toys], [User Selection], [Product].[UserTotal] } ON ROWS
FROM Sales
WHERE ([Measures].[Unit Sales])
http://mondrian.pentaho.com/d...
列出一些重要的,按返回類型來分類。
.currentMember
.parent
.prevMember/.nextMember
.firstChild/.lastChild
.firstSibling/.lastSibling
Ancestor(<Member>, <Level>)
Ancestor(<Member>, <Numeric Expression>)
LAG 返回當前成員開始往前數的本層的第幾個成員.
<Member>.Lag(n)
n是索引,0 是它自己,1是前一個(.prevMember)
LEAD 相似 Lag(),但方向相反
OpeningPeriod 返回某個層次上第一個後代成員
語法:OpeningPeriod([<Level>[, <Member>]])。
ClosingPeriod 返回某個層次上最後一個後代成員
PARALLELPERIOD 返回一個成員同層次對應位置的成員
ParallelPeriod([<Level>[, <n>[, <Member>]]])在時間維度上取同期(如上年同期)等的時候須要用到它。
前面介紹的 members、children、descendants、crossJoin、filter、order 都是集合函數
union
合併兩個集合。語法:Union(set1,set2[, ALL]) All 標誌指示保留重複元素
Except
從set1裏去除set2的元素,即求兩個集合的差。Except(set1,set2[, ALL])
Head/Tail
返回集合Head/Tail元素 。 Head/Tail(set[, <count>))。
.SIBLINGS
返回成員的兄弟成員,包括它本身。<Member>.Siblings。
.MEMBERS
返回維度/層次的成員。<Dimemsion>.Members
DESCENDANTS
返回成員的後代成員。Descendants (member, [level[,flag]])
flag 能夠是:SELF、BEFORE、SELF_BEFORE_AFTER、LEAVES、AFTER、SELF_AND_BEFORE、SELF_AND_AFTER。
DrillDownLevel(set,[level])
下鑽(一級)成員。
DrillDownLevelBottom(set,index,level)
下鑽最下一級成員。
DrillDownLevelBTop(set,index,level)
下鑽最上一級成員。
DrillDownMember
下鑽集合2中的成員.DrillDownMember(set1,set2[,Recursive])
TopCount 返回前n個數據的集合
<Set> TopCount(<Set>, <Numeric Expression>, <Numeric Expression>) <Set> TopCount(<Set>, <Numeric Expression>)
(TopCount, BottomCount, TopPercent, Hierarchize ,etc.)
count (set [,INCLUDEEMPTY])
可選標記指定是包含無數據的元組
Sum (set [,數值表達式]])
max/min/median/avg(set [,數值表達式]])
IS
object is object2。
例如:
[Jan 2000].PrevMember IS NULL
[Jan 2000].Level IS [Time].[Month]
ISEMPTY
判斷一個值是否爲空。語法:IsEmpey(表達式)。
NAME
返回維度、層次等的名稱。語法:<Dimension/Hierarchy/Level/Member>.Name
PROPERTIES
返回成員的屬性值。語法:<Member>.properties(<屬性名>)
這裏是一些返回類型不定的函數。iiF根據條件返回值,相似Excel 的If 函數。語法:iif(<布爾表達式>, <值1>, <值2>)。ITEM根據索引返回集合中元素。語法:item(set, <index>)。返回類型通常爲元組。