專注應用,關注發展,開拓創新

          <-------------------------------------------------------------------& 珍惜生命 . 善用時間 . 把握未來 . 創造價值。

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            11 Posts :: 17 Stories :: 10 Comments :: 0 Trackbacks

          我的評論

          re: 簡介 吳名居 2006-05-05 14:57  
          6.5.6 在 MDX 中創建和使用用戶定義函數


          1. 在 MDX 中使用用戶定義函數:

          無參數調用:
          MyNewFunction( )

          有參數調用:
          MyNewFunctionWithParms("Parameter1", 2, 800)

          2. USE LIBRARY 語句:

          用 USE LIBRARY 語句執行外部庫的裝載。
          用戶定義函數都必須與 COM 類相關聯,這些類通常以 Microsoft ActiveX 動態鏈接庫 (DLL) 的形式提供。

          假如用戶定義函數位于 C:\Winnt\System 、名為 MyFunc.dll 的 ActiveX DLL 的一部分,可將其裝載如下:
          USE LIBRARY "C:\WINNT\SYSTEM\MyFunc.dll"

          與 "MyFuncClass"類關聯,可裝載庫:
          USE LIBRARY "MyFunc.MyFuncClass"

          當引用可能位于不同服務器的不同位置的庫時,推薦使用本方法。

          多個庫可以用單個 USE LIBRARY 語句同時裝載:
          USE LIBRARY "C:\WINNT\SYSTEM\MyFunc.dll", "C:\WINNT\SYSTEM\NewFuncs.dll"

          不帶參數的 USE LIBRARY 語句將注消所有函數庫。
          3. DROP LIBRARY 語句


          DROP LIBRARY 語句可用于卸載特定庫或卸載所有的庫:

          DROP LIBRARY "MyFunc.MyFuncClass"

          PivotTable 服務支持 DROP LIBRARY 語句。
          4. 創建用戶定義函數

          用戶定義函數可用支持 COM 接口的任何編程語言創建

          用戶定義函數可接受任何可強制轉換為字符串、數字或者字符串數組或數字數組的參數。

          用戶定義類型或對象引用不能用作參數。

          數組也可用作參數

          返回空值的函數(例如 Visual Basic 中的子程序)也可使用,例如,如果想要在 MDX 語句中使用 MyVoidFunction() 函數,可采用下面的語法:

          CALL(MyVoidFunction)
          6.5.7 使用回寫

          將信息寫入到多維表達式 (MDX) 中的寫啟用多維數據集的功能稱為回寫。

          1. 最低級別成員回寫

          最低級別成員指維度中與該維度最低定義級別相關聯的成員。例如,下圖中,Products(產品)維度定義了三個級別("(全部)"級別不算在內)
          2. 聚合級別成員回寫

          聚合級別成員的值取決于與聚合級別以下級別相關的成員的值。例如,商標名稱級別即是聚合級別,因為其成員的值取決于在產品名稱級別上執行的聚合。

          為了修改聚合級別,所有用于為該聚合級別而構造該值的成員都必須進行修改,所以聚合級別回寫更難于處理。

          可以使用 UPDATE CUBE 語句。通過使用四個不同的分配公式之一。聚合級別回寫只有在使用 Sum 聚合函數聚合值時才能使用。

          聚合級別回寫尤其有用。聚合級別回寫速度更快,因為將其視為單個原子事務進行處理,確保了安全性驗證或公式驗證不會使多維數據集處于不一致的狀態。
          6.5.8 使用 DRILLTHROUGH 檢索源數據
          DRILLTHROUGH 語句從源數據中檢索行集。(鉆取)

          可以使用 AllowDrillThrough 和 DrillthroughColumns 屬性

          以下語法結構描述了 DRILLTHROUGH 語句:

          <drillthrough> := DRILLTHROUGH [<Max_Rows>] [<First_Rowset>] <MDX select>

          < Max_Rows> := MAXROWS <positive number>

          (<max_rows> 語法指定各個返回行集中行的最大個數)

          <First_Rowset> := FIRSTROWSET <positive number>

          (<first_rowset> 語法標識其行集最先返回的分區)
          下面的示例說明了 DRILLTHROUGH 語句的使用:

          DRILLTHROUGH
          SELECT [Warehouse].[All Warehouses].[Canada].[BC] ON ROWS,
          [Time].[1998].[Q1] ON COLUMNS,
          [Product].[All Products].[Drink] ON PAGES,
          [Measures].[Units Shipped] ON SECTIONS
          FROM [My Cube]
          6.5.9 理解傳遞次序和求解次序
          1.傳遞次序
          當 MDX 為查詢結果進行計算時,它至少要經過一個階段的計算,每一階段都稱為一個計算傳遞,
          可用順序位置(稱為計算傳遞號)對計算傳遞進行引用。

          完全計算所有單元所需的計算傳遞的計數稱為多維數據集的計算傳遞深度。
          始終有一個計算傳遞,用來檢索為多維數據集存儲的數據,稱為計算傳遞 0。
          包含自定義匯總公式或自定義匯總計算,稱計算傳遞 1
          計算單元才會有大于 1 的計算傳遞號

          傳遞關系圖 傳遞描述
          計算傳遞 3
          因為帶紅色陰影的計算單元定義的 CALCULATION_PASS_DEPTH 為 2,所以再次對單元進行遞歸計算,所用的是從上一計算傳遞派生的值。在此傳遞中也再次對計算成員和自定義匯總公式進行計算。

          計算傳遞 2
          對兩個計算單元定義的計算都根據 CALCULATION_PASS_NUMBER 和 CALCULATION_PASS_DEPTH 的取值從此處開始。在此傳遞中也再次對計算成員和自定義匯總公式進行計算。

          計算傳遞 1
          所有自定義匯總公式和自定義匯總運算符都在傳遞 1 上開始計算。

          計算傳遞 0
          從源檢索數據。計算計算成員和自定義成員。此時不執行其它計算。
          6.6 有效應用 MDX
          6.6.1 MDX 中的注釋


          // C++ 風格的正斜線。

          -- SQL 風格的連字符。

          /*...*/ C 風格的正斜線與星號對。
          示例說明 MDX 命令中注釋的使用:

          /* Using this query to view
          info about units shipped
          and units ordered */

          WITH MEMBER [Measures].[ShippingPercent] AS
          '-- Returns [Units Shipped] over [Units Ordered] as a percent value
          Measures.[Units Shipped] / Measures.[Units Ordered]',
          FORMAT_STRING = 'Percent'

          SELECT
          { [Measures].[Units Shipped], [Measures].[Units Ordered], [Measures].[ShippingPercent] } ON COLUMNS,
          // The next command specifies nonempty members only
          NON EMPTY [Store].[Store Name].Members ON ROWS
          FROM Warehouse -- Pulled from the Warehouse cube

          注釋加入了信息,但卻不影響性能。
          re: 簡介 吳名居 2006-05-05 14:54  
          6.5.4 生成 MDX 中的高速緩存

          MDX 常用多維數據集切片裝載到內存,對其進行高速緩存以達到更快檢索的目的。

          (1) 可使用 CREATE CACHE 語句。
          (2) WITH 語句也可完成這項任務。

          例如,下面的 MDX 查詢使用 WITH 語句來進行高速緩存:

          WITH CACHE AS '(Store.[Store Name].Members)'

          SELECT
          {[Store].[Store Name].Members} ON COLUMNS,
          {[Measures].[Unit Sales]} ON ROWS
          FROM Sales
          使用 WITH 創建高速緩存

          [WITH <formula_specification>] [, <formula_specification>]
          SELECT [<axis_specification> [, <axis_specification>...]]
          FROM [<cube_specification>]
          [WHERE [<slicer_specification>]]

          高速緩存的 <formula_specification> 值進一步分解:

          <formula_specification> ::= CACHE AS '(<set>[, <set>...])'

          (1) <set> 值是用來創建高速緩存的集合表達式。<set> 值可支持 MDX 集合函數的使用。
          (2) 當用 <set> 集合表達式構造高速緩存時,下列規則適用:
          (a) 每個 <set> 都必須包含僅來自一個維度的成員。各個成員必須互不相同。
          (b) 各個 <set> 必須來自不同的維度。
          (c) <set> 不能包含度量值。
          6.5.5 生成 MDX 中的計算單元
          計算單元功能通過使您得以定義單元的特定切片(稱為計算子多維數據集),并將公式應用到該計算子多維數據集內的各個單元來提供此功能。應用公式時,依據的是可應用于每個單元的可選條件。
          計算成員是維度成員,其值于運行時通過在定義計算成員時所指定的表達式計算而得到。

          (1) 使用 CREATE CELL CALCULATION 語句。對于現有多維數據集,ALTER CUBE 語句也可用來添加計算單元。

          (2) 若要創建用于會話生存周期的計算單元,請使用 CREATE CELL CALCULATION 語句。

          (3) 若要創建用于查詢生存周期的計算單元,請使用 WITH 語句
          使用 WITH 創建計算單元

          [WITH <formula_specification>] [, <formula_specification>]
          SELECT [<axis_specification> [, <axis_specification>...]]
          FROM [<cube_specification>]
          [WHERE [<slicer_specification>]]

          <formula_specification> ::= CELL CALCULATION <formula_name>
          FOR '(<calculation_subcube>)'
          AS '<calculation_formula>' [,<calculation_property_list>]

          <cell_property_list> ::= <property_name = '<value>’
          [, <property_name> = '<value>'...]

          <formula_name> 值是計算單元的名稱。<calculation_subcube> 包含一列正交的、單維度 MDX 集合表達式,而每個表達式都必須解析為下列集合分類之一:
          分類 描述 :


          空集合:解析為空集合的 MDX 集合表達式。在這種情況下,該集合被忽略。

          單個成員集合:解析為單個成員的 MDX 集合表達式。

          級別成員的集合:解析為單個級別的成員的 MDX 集合表達式。其示例為 <<Level>>.Members MDX 函數。若要包括計算成員,請使用 <<Level>>.AllMembers MDX 函數。

          后代的集合:解析為指定成員后代的 MDX 集合表達式。其示例為 Descendants(<<Member>>, <<Level>>, <<Desc_flags>>) MDX 函數。
          補充考慮事項:

          CONDITION 屬性指定的計算條件根據計算單元定義的創建范圍只處理一次。這提高了賦值多個計算單元定義的性能,尤其是多維數據集傳遞間具有重疊的計算單元的情況。

          如果計算條件在全局范圍內作為多維數據集的一部分創建,則在處理多維數據集時處理計算條件。如果以任何方式在多維數據集中修改了單元,而且單元包括在計算單元定義的計算子多維數據集中,則在重新處理該多維數據集前,該計算條件可能不準確。

          如果計算條件在會話范圍創建,則在會話中發出該語句時對計算條件進行處理。與全局創建的計算單元定義一樣,如果修改單元,則計算條件對于計算單元定義可能不準確。

          如果計算條件在查詢范圍創建,則在執行查詢時對計算條件進行處理。雖然 MDX 查詢執行的處理時間短,數據滯后時間問題充其量是極輕微的,但單元修改問題在這里同樣存在。

          另一方面,只要對包含單元(這些單元包含在計算單元定義中)的多維數據集發出 MDX 查詢,就會處理計算公式,而與范圍無關。
          re: 簡介 吳名居 2006-05-05 14:53  
          下例的 MDX 查詢示例定義了兩個計算成員。第一個計算成員 [Measures].[StoreType] 用于表示 Store Type 成員屬性。第二個計算成員 [Measures].[ProfitPct] 用于計算給定商店的總利潤率,并將其表示為格式化的百分比值。

          WITH
          MEMBER [Measures].[StoreType] AS
          '[Store].CurrentMember.Properties("Store Type")',
          SOLVE_ORDER = 2
          MEMBER [Measures].[ProfitPct] AS
          'Val((Measures.[Store Sales] - Measures.[Store Cost]) /
          Measures.[Store Sales])',
          SOLVE_ORDER = 1, FORMAT_STRING = 'Percent'
          SELECT
          { [Store].[Store Name].Members} ON COLUMNS,
          { [Measures].[Store Sales], [Measures].[Store Cost],
          [Measures].[StoreType], [Measures].[ProfitPct] } ON ROWS
          FROM Sales
          計算成員可在層次結構的任意位置創建。

          下例 MDX 查詢示例定義作為 [Beer and Wine] 成員的子成員創建的計算成員,以確定給定商店的啤酒和果酒 (Beer and Wine) 的單位銷售額是否至少為 100.00:


          WITH
          MEMBER [Product].[Beer and Wine].[BigSeller] AS
          'IIf([Product].[Beer and Wine] > 100, "Yes","No")’

          SELECT
          {[Product].[BigSeller]} ON COLUMNS,
          {Store.[Store Name].Members} ON ROWS
          FROM Sales

          使用同一 MDX 中其它計算成員的計算成員:

          WITH
          MEMBER [Measures].[ProfitPct] AS
          'Val((Measures.[Store Sales] - Measures.[Store Cost]) /
          Measures.[Store Sales])',
          SOLVE_ORDER = 1, FORMAT_STRING = 'Percent'
          MEMBER [Measures].[ProfitValue] AS
          '[Measures].[Store Sales] * [Measures].[ProfitPct]',
          SOLVE_ORDER = 2, FORMAT_STRING = 'Currency'
          SELECT
          { [Store].[Store Name].Members} ON COLUMNS,
          { [Measures].[Store Sales], [Measures].[Store Cost],
          [Measures].[ProfitValue], [Measures].[ProfitPct] } ON ROWS
          FROM Sales

          第二個計算成員 [Measures].[ProfitValue] 使用第一個計算成員 [Measures].[ProfitPct] 中創建的值來生成自己的值。
          2. 在計算成員中使用函數

          (1) 算術運算符: + , - , * , /
          (2) 比較運算符: > , < , >= , <= , < > , =
          (3) 按位運算符: AND , OR , NOT , XOR (與 C 相同)
          (4) 集合運算符:
          <<Set1>> + <<Set1>> 對兩個集合執行 Union 函數。
          <<Set1>> * <<Set2>> 對兩個集合執行 Crossjoin 函數。
          <<Set1>> - << Set2>> 對兩個集合執行 Except 函數。
          <<Member1>> : <<Member2>> 創建自然排序集合,并將兩個成員作為終結點,這兩個指定成員間的所有成員作為集合的成員包括其中。
          5)數值函數

          如下面的 MDX 查詢示例所示,當 Aggregate 函數與產生總和的度量值相組合時,功能尤其強大:

          WITH
          MEMBER [Time].[1st Half Sales] AS 'Aggregate({Time.[Q1], Time.[Q2]})'
          MEMBER [Time].[2nd Half Sales] AS 'Aggregate({Time.[Q3], Time.[Q4]})',
          MEMBER [Time].[Difference] AS 'Time.[2nd Half Sales] - Time.[1st Half Sales]',
          SELECT
          { [Store].[Store State].Members} ON COLUMNS,
          { Time.[1st Half Sales], Time.[2nd Half Sales], Time.Difference} ON ROWS
          FROM Sales
          WHERE [Measures].[Store Sales]

          查詢產生了各州的店面銷售額總和,帶有前兩個計算成員用 Aggregate 函數所提供的上半年和下半年的聚合,以及由第三個計算成員提供的二者的差額。
          MDX 還提供了一列統計函數,以處理例程統計計算,例如,Median 函數計算集合內的中值,以下 MDX 查詢:

          WITH
          MEMBER [Time].[1st Half Sales] AS 'Sum({[Time].[Q1], [Time].[Q2]})'
          MEMBER [Time].[2nd Half Sales] AS 'Sum({[Time].[Q3], [Time].[Q4]})'
          MEMBER [Time].[Median] AS 'Median(Time.Members)'
          SELECT
          NON EMPTY { [Store].[Store Name].Members} ON COLUMNS,
          { [Time].[1st Half Sales], [Time].[2nd Half Sales], [Time].[Median]} ON ROWS
          FROM Sales
          WHERE [Measures].[Store Sales]

          在本示例中,除了 [Time].[1st Half Sales] 和 [Time].[2nd Half Sales] 計算成員提供的各個商店的上半年和下半年的店面銷售額的聚合之外,還有 [Time].[Median] 計算成員提供的各個商店店面銷售額的中值。
          6) 字符串函數


          MDX 提供許多字符串函數,不只是為了 MDX 表達式內的字符串處理,還為了支持 MDX 中用戶定義函數。

          例如,MemberToStr 函數將某成員引用轉換為 MDX 格式的字符串以用于用戶定義函數,因為用戶定義函數不接受來自 MDX 的對象引用。
          (7)集合函數

          集合函數用于在 MDX 中返回集合,為用戶提供方便生成動態定義的集合和快速創建可再次使用的命名集的功能。
          Members 函數是最常用的集合函數之一,它將級別或維度的所有成員(計算成員除外)作為一個集合返回。
          下面的 MDX 查詢示例示范了工作中的 Members 函數。

          SELECT
          NON EMPTY { [Store].[Store Name].Members} ON COLUMNS,
          {Measures.[Store Sales]} ON ROWS
          FROM Sales

          本 MDX 查詢示例返回了 Sales 多維數據集中的各個商店的總銷售額數字。如果不用 Members 函數,則不得不顯式輸入各個商店名稱,以使其完成本 MDX 查詢示例的功能。
          (8) 元組函數


          如同集合函數,元組函數用于在 MDX 中返回元組。元組函數還用于輔助 MDX 中的用戶定義函數,如 StrToTuple 函數。

          由于用戶定義函數不能處理 MDX 對象引用,用戶定義函數可以返回 MDX 格式的字符串返回值來表示元組,并使用 StrToTuple 函數將它轉換為有效的元組引用。
          (9) 成員函數

          計算成員中常常引用成員;成員函數允許計算成員執行復雜成員檢索,從而同樣輕松地處理層次結構和集合。

          MDX 中計算成員的解可以是本質上迭代的,因為計算成員可以基于對集合成員的迭代進行構造。MDX 中 CurrentMember 之類的函數使您得以利用此迭代功能
          (10) IIf 函數

          多維表達式 (MDX) 中的 IIf 函數可用于執行簡單的是或否決策。下例 MDX 查詢示例:

          WITH MEMBER [Measures].[BigSeller] AS
          'IIf(Measures.[Store Sales] > 20000, "Yes", "No")'


          SELECT
          {[Store].[Store Name].Members} ON COLUMNS,
          {[Measures].[Store Sales], [Measures].[BigSeller]} ON ROWS
          FROM Sales

          本 MDX 示例返回兩行。一行是 [Measures].[Store Sales] 成員,提供各個商店的總銷售額。第二行是一個計算成員,它基于各個商店的銷售額決定商店是否是個"大銷售商"。
          re: 簡介 吳名居 2006-05-05 14:51  
          (5) 自定義成員屬性

          自定義成員屬性可添加到維度中的特定命名級別中。自定義成員屬性不能添加到維度的“(全部)”級別,或添加到維度本身

          用來引用自定義成員屬性的語法類似于用來引用內在級別成員屬性的語法,如下列示例所示:

          PROPERTIES [<Dimension>.]<Level>.<Custom Member Property>
          2. 單元屬性的使用

          MDX 單元屬性所包含的信息,是單元的內容和格式的信息。

          下例顯示 MDX SELECT CELL PROPERTIES 關鍵字語法。

          SELECT [<axis_specification> [, <axis_specification>...]]
          FROM [<cube_specification>]
          [WHERE [<slicer_specification>]]
          [<cell_props>]

          <cell_props> ::= CELL PROPERTIES <property> [, <property>...]
          下表列出用于 <property> 值的受支持內在單元屬性

          屬性 描述

          BACK_COLOR: 顯示 VALUE 或 FORMATTED_VALUE 屬性的背景顏色。有關更多信息,請參見 FORE_COLOR 和 BACK_COLOR 內容。

          CELL_EVALUATION_LIST: 適用于單元的以分號分隔的一列求值公式,按從最低到最高的求解次序排列。有關求解次序的更多信息,請參見理解傳遞次序和求解次序。

          CELL_ORDINAL 數據集中單元的序列號。

          FORE_COLOR: 顯示 VALUE 或 FORMATTED_VALUE 屬性的前景顏色。有關更多信息,請參見 FORE_COLOR 和 BACK_COLOR 內容。
          默認情況下,如果未用 CELL PROPERTIES 關鍵字,則返回的單元屬性為 VALUE、FORMATTED_VALUE 和 CELL_ORDINAL(按此順序)。
          如果使用了 CELL PROPERTIES 關鍵字,則只返回用此關鍵字顯式聲明的單元屬性。

          下例示范了 MDX 查詢中 CELL PROPERTIES 關鍵字的使用:

          SELECT
          {[Measures].[Unit Sales], [Measures].[Store Size]} ON COLUMNS,
          {[Store].[Store Name].Members} ON ROWS
          FROM Sales
          CELL PROPERTIES VALUE, FORMATTED_VALUE, FORMAT_STRING, FORE_COLOR, BACK_COLOR
          3. 使用 Custom Member Options 屬性

          使用維度編輯器或多維數據集編輯器的 Custom Member Options 屬性,可通過 Analysis Manager 設置單元屬性。

          Custom Member Options 屬性接受每個成員的列引用,該引用包含以逗號分隔的單元屬性列表。

          單元屬性以字符串表達式的形式表示,如例所示。

          FORE_COLOR='255', BACK_COLOR='65535'

          示例為指定成員提供一個帶紅色前景的黃色背景。
          4. 使用 FORMAT_STRING 單元屬性


          FORMAT_STRING 單元屬性用于格式化 VALUE 單元屬性,以創建 FORMATTED_VALUE 單元屬性值。

          FORMAT_STRING 單元屬性對于字符串和數字原始值均能處理,它對該值應用格式表達式以返回 FORMATTED_VALUE 單元屬性的格式化值。
          5. 使用字符串值符號

          字符串的格式表達式可以是一部分,也可以是由分號 (;) 分隔開的兩部分。

          一部分格式應用于所有字符串值。

          兩部分時第一部分應用于字符串數據,而第二部分應用于空值和零長度字符串 ("")。



          (1)@ 字符占位符。它顯示一個字符或一個空格。
          (2)& 字符占位符。它顯示一個字符或什么都不顯示。
          (3)< 強制小寫。以小寫格式顯示所有字符。
          (4)> 強制大寫。以大寫格式顯示所有字符。
          (5) ! 強制從左到右填充占位符。
          6. 使用數字值

          數字的用戶定義格式表達式可以有一到四個由分號分隔的部分。如果格式參數包含一個命名數字格式,則只允許有一個部分。

          一部分:格式表達式應用于所有值。
          兩部分:第一部分應用于正值和零,第二部分應用于負值。
          三部分: 第一部分應用于正值,第二部分應用于負值,第三部分應用于零。
          四部分:第一部分應用于正值,第二部分應用于負值,第三部分應用于零,第四部分應用于空值。

          下例具有兩個部分:"$#,##0;($#,##0)"

          如果包含兩個緊挨著的分號,則缺少的部分用正值的格式打印。
          "$#,##0;;\Z\e\r\o"

          7. 使用 FORE_COLOR 和 BACK_COLOR 單元屬性

          以 Microsoft Windows 操作系統紅-綠-藍 (RGB) 格式存儲單元的文本和背景的顏色信息。

          范圍為 0 到 16,777,215 (&H00FFFFFF)

          數字的高位字節始終等于 0;低位的 3 個字節,從最低位字節到最高位字節分別決定了紅色、綠色和藍色的數量。紅色、綠色和藍色成分分別由一個 0 到 255 (&HFF) 之間的數字表示。

          例如,值 255 (&H000000FF) 代表紅色,值 65280 (&H0000FF00) 代表綠色,而值 16711680 (&H00FF0000) 代表
          6.5.2 生成 MDX 中的命名集
          MDX 中的集可能是長而復雜并且不易理解的聲明
          (參閱 p163 式子)
          命名集是一個與別名相關聯的集合表達式。命名集可將集合中的成員或函數合并。

          命名集是維度成員集或所創建的可以再度使用的集合表達式。

          WITH SET [ChardonnayChablis] AS
          '{[Product].[All ……..
          …………..
          SELECT
          [ChardonnayChablis] ON COLUMNS,
          {Measures.[Unit Sales]} ON ROWS
          FROM Sales
          使用 WITH 創建命名集

          [WITH <formula_specification>] [, formula_specification>]
          SELECT [<axis_specification> [, <axis_specification>...]]
          FROM [<cube_specification>]
          [WHERE [<slicer_specification>]]

          <formula_specification> ::= SET <set_name> AS '<set>'

          <set_name> 參數包含命名集的別名。
          <set> 參數包含命名集別名所指的集合表達式。
          示例使用 Filter、CurrentMember、Name 和 InStr 函數來創建 [ChardonnayChablis] 命名集:
          // VB:InStr ([start, ] string1, string2 [, compare])
          //返回:指定一字符串在另一字符串中最先出現的位置。
          // CurrentMember: MDX 表達式,拒絕對度量值“ chardonnay ”
          //的單元的訪問,但允許對所有其它度量值的單元的訪問
          // Filter(«Set», «Search Condition»)
          //返回根據搜索條件對指定集合進行篩選所得到的集合。
          WITH SET [ChardonnayChablis] AS
          'Filter([Product].Members, (InStr(1, [Product].CurrentMember.Name, "chardonnay") <> 0) OR (InStr(1, [Product].CurrentMember.Name, "chablis") <> 0))'

          SELECT
          [ChardonnayChablis] ON COLUMNS,
          {Measures.[Unit Sales]} ON ROWS
          FROM Sales
          6.5.3 生成 MDX 中的計算成員
          1. 使用 WITH 創建計算成員

          [WITH <formula_specification>] [, <formula_specification>]
          SELECT [<axis_specification> [, <axis_specification>...]]
          FROM [<cube_specification>]
          [WHERE [<slicer_specification>]]

          <formula_specification> ::= MEMBER <member_name>
          AS '<value_expression>'
          [,SOLVE_ORDER = <unsigned integer>]
          [,<cell_property> = <value_expression>...]

          (1)<member_name> 值是計算成員的完全合法名稱, <value_expression> 在經過計算后,將返回計算成員的值。
          (2)使用 SOLVE_ORDER 關鍵字指定計算成員的求解次序
          (3)<cell_property> 值中提供單元屬性的名稱和在 <value_expression> 值中提供單元屬性值,可隨意指定計算成員內在單元屬性的值
          re: 簡介 吳名居 2006-05-05 14:49  
          維度成員屬性前是應用屬性的維度的名稱

          下例示范了正確的語法:

          DIMENSION PROPERTIES <<Dimension>>.ID

          級別成員屬性前可加上級別名,或為附加規范加上維度和級別名,如下所示:

          DIMENSION PROPERTIES [<<Dimension>>.]<<Level>>.ID
          4) 內在成員屬性
          內在成員屬性不能為特定維度或級別加以請求,而應用于多維表達式 (MDX) 查詢中軸維度的所有成員

          例如,在 MDX 查詢中指定下列語句:

          PROPERTIES DESCRIPTION

          返回對軸維度中各個成員的描述。
          下表列出所支持的內在成員屬性:

          屬性 : 描述

          CALCULATION_PASS_DEPTH: 僅用于計算單元。計算公式的傳遞深度,此屬性確定解析計算公式需要多少個傳遞。有關傳遞次序的更多信息,請參見理解傳遞次序和求解次序。

          CALCULATION_PASS_NUMBER: 僅用于計算單元。計算公式的傳遞號,此屬性確定計算公式將分別在哪個傳遞上開始賦值和結束計算。該屬性的默認值為 1;其最大值為 65,535。有關傳遞次序的更多信息,請參見理解傳遞次序和求解次序。
          re: 簡介 吳名居 2006-05-05 14:48  
          1. 指定軸維度的內容

          <axis_specification> 語法可分解為:

          <axis_specification> ::= <set> ON <axis_name>

          <axis_name> ::= COLUMNS | ROWS | PAGES | SECTIONS | CHAPTERS | AXIS(<index>)

          每個軸維度與一個數字相關聯:
          0 對應于 x 軸,1 對應于 y 軸,2 對應于 z 軸,等等。
          <index> 值是軸號。對于前 5 個軸,COLUMNS、ROWS、PAGES、SECTIONS 和 CHAPTERS 這幾個別名可分別代替 AXIS(0)、AXIS(1)、AXIS(2)、AXIS(3) 和 AXIS(4) 使用。
          2. 指定切片器維度的內容

          (1)顯式指派給軸的維度是切片器維度
          (2)假定未顯式指派給軸的維度是切片器維度,用其默認成員進行篩選。
          (3)如果未顯式指定默認成員,
          如果存在“(全部)”級別,則默認成員為“全部”成員,
          否則為最高級別的任意成員。("全部"成員的名稱不必為"全部"。)
          6.4.4 建立多維數據集上下文


          MDX 查詢提供上下文:

          FROM <<cube_specification>>
          << cube_specification >> 由單個多維數據集的名稱完成。

          這并未限制用戶一次使用多個多維數據集;可以使用 LookupCube 函數來從多維數據集上下文以外的多維數據集檢索數據。

          與 SQL 不同,MDX 查詢中的 FROM 子句通常不允許聯接:

          FROM SalesCube, OtherCube
          6.5 高級 MDX
          6.5.1 創建和使用屬性值

          1. 成員屬性的使用
          各個元組中每個成員的一些基本信息,如成員名、父級別、子代數目等等。這些信息即稱為成員屬性。成員屬性可視為存儲于單個維度上按維度組織的數據。

          例如,若要創建 Store Name 級別中成員的成員屬性 Store Type,須確保 Store Type 列與 Store Name 列在相同的表中,然后將 Store Type 作為成員屬性插入到 Store Name 級別中。

          (1) DIMENSION PROPERTIES 關鍵字

          SELECT [<axis_specification> [, <axis_specification>...]]
          FROM [<cube_specification>]
          [WHERE [<slicer_specification>]]

          <axis_specification> ::= <set> [<dim_props>] ON <axis_name>

          <dim_props> ::= [DIMENSION] PROPERTIES <property> [,<property>...]

          property 語法的分解會因所查詢的屬性而有所不同。維度和級別的內在成員屬性前必須加上維度和/或級別的名稱。
          成員的內在成員屬性不能由維度名或級別名限定。自定義成員屬性前應加上其所駐留的級別的名稱。
          例:

          SELECT //Members 函數是最常用的集合函數之一,
          //返回維度、級別或層次結構中成員的集合

          CROSSJOIN(年, (銷售量, 預算銷售量)) ON COLUMNS,
          NON EMPTY 產品.MEMBERS // 關鍵字,非空
          DIMENSION PROPERTIES 產品.SKU, 產品.SRP ON ROWS
          FROM SalesCube
          WHERE (一月, 銷售代表.[All], 地理.美國)

          返回以下數據集:
          (2) Properties 函數

          成員屬性還可通過使用 MDX 中的 Properties 函數進行檢索。例如,下面的 MDX 查詢使用 WITH 關鍵字來創建包含 [Store Sqft] 成員屬性的計算成員:

          WITH // 生成計算成員
          MEMBER [度量值].[商店規模] AS
          ‘Val(商店.當前成員.屬性(“商店平方米”))’ //VB庫中的函數


          SELECT
          {[度量值].[單個銷售額], [度量值].[商店規模]} ON COLUMNS,
          {[商店].[商店名稱].成員} ON ROWS
          From Sales
          請注意 MDX 查詢示例中 Val( ) 函數的使用。Properties 函數是字符串類型的函數;所有用 Properties 函數檢索的成員屬性均將強制轉換為字符串。
          (3) 內在維度和級別成員屬性

          所有維度和級別均支持下表所列的內在成員屬性。這些成員屬性在特定維度或級別的上下文中使用,并且為指定維度或級別的每個成員提供值。例如,在多維表達式 (MDX) 查詢中指定下列語句:

          [Sales].Name //返回級別、維度、成員或層次結構的名稱

          返回 [Sales] 維度的各個引用成員的名稱:


          屬性 描述
          ID 成員的內部維護 ID
          Key 存儲于 MEMBERS 架構行集的 MEMBER_KEY 列中
          成員的值
          Name 成員的名稱
          re: 簡介 吳名居 2006-05-05 14:46  
          6.4.2 成員、元組和集合
          1. 成員
          下圖加入陰影以表示 “時間.[下半年].[第三季度]” 成員。
          成員名和成員鍵:

          引用成員的可選方法是引用成員鍵。成員鍵由維度用來專門標識給定成員。
          成員鍵: 用 & 字符將成員鍵與成員名區別開

          [時間].[下半年].&[Q4] ( "第四季度"成員的成員鍵 Q4)

          引用成員鍵確保在可更改維度中以及在具有非唯一成員名的維度中成員的正確標識。

          可用成員名或其成員鍵引用某個成員。上一示例中用其成員名 “第四季度” 引用 “時間” 維度中的成員
          計算成員:

          可將成員創建為 MDX 查詢的一部分,以使返回的數據基于估值表達式,而不是要查詢的多維數據集中所存儲的數據,這些成員稱為計算成員。

          如以下示例所示:

          WITH MEMBER [Measures].[PackagesForecast] AS
          '[Measures].[Packages] * 1.1'
          成員函數:

          MDX 提供許多函數來從其它 MDX 實體(如維度和級別)檢索成員

          // FirstChild 函數允許從給定維度或級別檢索所有的成員


          // 下列兩式具有相同效果

          顯式聲明 : 時間.[上半年]
          函數調用 : 時間.FirstChild // "時間"維度的第一個子代成員
          2. 元組
          元組用于定義來自多維數據集的數據切片;它由來自一個或多個維度的單個成員的有序集合組成。
          元組用于標識來自多維數據集的特定多維數據塊;元組是一種成員向量;請把元組看作基礎數據庫中的一個或多個記錄
          3. 集合
          集合是零個、一個或多個元組的有序集合。集合最常用于在 MDX 查詢中定義軸維度和切片器維度,并且可能只具有單個元組或可能在某些情況下為空。
          集合指以元組表示的一組成員組合,或指集合中的元組所代表的單元中的值(視使用的上下文而定)
          元組用花括號括起來以構造集合

          示例

          { (時間.[上半年], 源.非陸地.航空), (時間.[下半年],源.非陸地.海路) }

          { 時間.[下半年], 時間.[下半年] } // 允許同一個元組重復出現
          聚合函數

          冒號運算符使用成員的自然順序創建集合

          兩邊的成員包含在結果集內:{[第一季度]:[第四季度]}



          集合和維數

          集合的維數用其中各個元組的維數表達。集合內元組的順序非常重要

          下例不能作為集合使用:集合中的元組必須具有相同的維數

          { (時間.[下半年],源.非陸地.航空), (源.非陸地.航空, 時間.[下半年]) }
          6.4.3 軸維度和切片器維度

          軸維度,為多個成員檢索數據的維度。

          切片器維度,為單個成員檢索數據的維度。
          re: 簡介 吳名居 2006-05-05 14:44  
          6.1 概述
          MDX( Multidimensional Expressions )是一種語法,支持多維對象與數據的定義和操作
          MDX 在很多方面與結構化查詢語言 (SQL) 語法相似,但它不是 SQL 語言的擴展;事實上,MDX 所提供的一些功能也可由 SQL 提供,盡管不是那么有效或直觀。

          每個 MDX 查詢都要求有 SELECT 子句、FROM 子句和WHERE 。MDX 還提供了可靠的函數集,用來對所檢索的數據進行操作,同時還具有用用戶定義函數擴展 MDX 的能力。

          MDX 提供管理數據結構的 DDL 語法,其中有用于創建(和刪除)多維數據集、維度、度量值以及它們的坐標對象的 MDX 命令。
          下面說明用于存儲定單信息的傳統關系數據庫:
          6.2 基本概念

          對于多維數據,則可以用具有兩個以上維的結構來表示。這些稱作多維數據集的結構具有多個維度。

          在多維數據集中維度的交集處,可能有不止一個數據元素,這些數據元素稱為度量值。
          6.2.1 單元、元組和集合
          SQL 從表返回二維數據子集,而 MDX 從多維數據集返回多維數據子集。
          以下元組標識其中值為 240 的單元:
          路線(.[東半球].[非洲], 時間.[下半年].[第四季度], 源.[非陸地].[航空], 度量值.包 )

          元組唯一標識多維數據集中的一部分;它不必指某個特定單元(切片)
          (源.[東半球])
          (時間.[下半年], 源.[西半球])

          元組的有序集合稱為集合
          { (時間.[上半年].[第一季度]), 時間.[下半年].[第三季度]) }
          6.2.2 軸維度和切片器維度

          SELECT 語句用來選擇要返回的維度和成員,稱之為軸維度。

          WHERE 語句用來將返回的數據限定為特定維度和成員條件,稱之為切片器維度。

          軸維度預期返回多個成員的數據,而切片器維度預期返回單個成員的數據。
          6.2.3 計算成員
          計算成員不是基于數據、而是基于 MDX 中估值表達式的成員

          6.2.4 用戶定義函數
          用戶可以創建和注冊自己的函數,這些函數對多維數據進行操作,同時按 MDX 語法接受參數并返回值。

          6.2.5 PivotTable 服務
          MDX 數據定義和操作服務通過 PivotTable 服務提供。
          PivotTable 服務用于本地多維數據集的定義和操作,使用此多維數據集可以多維格式在本地存儲數據。
          6.3 SQL 和 MDX 比較

          (1) 專門檢索具有幾乎任意多個維度的多維數據結構中的數據
          (2) MDX 在查詢中則可處理一個、兩個、三個或更多的維度。
          (3) 在 MDX 中 SELECT 子句可用于定義幾個軸維度,而 WHERE 子句可用來多維數據限制于特定的維度或成員。
          (4) WHERE 子句用于提供查詢所返回的數據切片。
          (5) WHERE 子句中的各個成員標識來自不同維度的數據的不同部分
          (6) MDX 查詢的創建者通常將多維數據集的結構形象化并加以定義,并且編寫對單個多維數據集的查詢對該結構進行填充
          (7) MDX 結果集的視覺形象不直觀。因為多維結果集可以有三個以上的維度,所以將該結構形象化比較困難
          6.4 基本 MDX
          6.4.1 基本 MDX 查詢

          SELECT [<axis_specification> [, <axis_specification>...]]
          FROM [<cube_specification>]
          [WHERE [<slicer_specification>]]

          要指定數據集,MDX 查詢必須包含有關下列各項的信息:

          (1) 軸的數目。最多可在 MDX 查詢中指定 128 個軸。

          (2) 要包括在 MDX 查詢的各個軸上的來自各個維度的成員。

          (3) 設置 MDX 查詢上下文的多維數據集的名稱。

          (4) 來自切片器維度的成員,在該維度上對來自軸維度的成員進行數據切片
          基本 MDX 查詢示例:


          別名
          SELECT
          { [Measures].[Unit Sales], [Measures].[Store Sales] } ON COLUMNS,
          { [Time].[1997], [Time].[1998] } ON ROWS
          FROM Sales
          WHERE ( [Store].[USA].[CA] )
          MDX SELECT 語句的語法格式與 SQL 語法類似;可是用戶將注意到以下幾個顯著區別:

          (1) MDX 語法通過用花括號({ 和 } 字符)括住元組或成員來辨別集合。

          (2) MDX 查詢在 SELECT 語句中最多可以有 128 個軸維度,但只有前 5 個軸有別名。軸可以用其在 MDX 查詢中的順序位置或者用其別名(如果給它指派了別名的話)來引用。

          SELECT
          { [Measures].[Unit Sales], [Measures].[Store Sales] } ON AXIS(0),
          { [Time].[1997], [Time].[1998] } ON AXIS(1)
          FROM Sales WHERE ( [Store].[USA].[CA] )

          (3) 如同 SQL 查詢一樣,FROM 子句為 MDX 查詢指定數據的源

          (4) WHERE 子句用于描述切片器維度。
          re: 簡介 吳名居 2006-05-05 14:35  
          當設計多維表達式 (MDX) 查詢時,應用程序一般查看多維數據集并將維度集合劃分為兩個子集:


          軸維度,為多個成員檢索數據的維度。

          切片器維度,為單個成員檢索數據的維度。(相當于在走切片操作中選擇某一個具體的成員)

          SELECT
          { Route.nonground.Members } ON COLUMNS,
          { Time.[1st half].Members } ON ROWS
          FROM TestCube
          WHERE ( [Measures].[Packages] )






          每個軸維度與一個數字相關聯:0 對應于 x 軸,1 對應于 y 軸,2 對應于 z 軸,等等。<index> 值是軸號。對于前 5 個軸,COLUMNS、ROWS、PAGES、SECTIONS 和 CHAPTERS 這幾個別名可分別代替 AXIS(0)、AXIS(1)、AXIS(2)、AXIS(3) 和 AXIS(4) 使用。

          MDX 查詢無法跳過軸。也就是說,包含一個或多個 <axis_name> 值的查詢不能排除低編號軸或中間軸。例如,查詢不能有 ROWS 軸而無 COLUMNS 軸,或有 COLUMNS 和 PAGES 軸而無 ROWS 軸。

          3:度量值如何向最終用戶顯示
          度量值構成了提供給最終用戶的多維數據集信息的核心。顯示形式是表格還是圖形,取決于最終用戶用來瀏覽多維數據集的客戶端應用程序,但度量值卻是最終用戶所關心的信息。

          使用表格時,度量值是以行和列的形式顯示的。盡管多維數據集的維度決定了列標題和行標題,但度量值仍是行和列中的數據。然而,如果您在多維數據集 中指定多個度量值,那么它們也會提供多個標題來區分度量值。

          使用圖形方式時,度量值可以用多種方式顯示,其中包括線條、形狀、顏色、底紋和陰影。但是,和使用表格方式一樣,度量值占據中心主要區域,而維度提供外圍標簽。

          4:如果成員的名稱中有空格或數字,則要使用括號字符 [ 和 ]。盡管"時間"維度是一個詞,也可在其外面加上方括號;上面的關系圖中所示的成員還可表示為:

          5:計算成員
          還可將成員創建為 MDX 查詢的一部分,以使返回的數據基于評估表達式,而不是要查詢的多維數據集中所存儲的數據。這些成員稱為計算成員,它們提供大量的 MDX 的功能和靈活性。在 MDX 查詢中用 WITH 關鍵字定義計算成員。例如,如果想要通過增加"包"度量值現有值的 10% 來對所有包裹進行預測估算,可以僅創建一個提供此信息的計算成員,并象使用多維數據集中的任何其它成員那樣使用它,如以下示例所示。

          WITH MEMBER [Measures].[PackagesForecast] AS
          '[Measures].[Packages] * 1.1'
          6:元組
          在 MDX 中,元組根據其復雜性依照語法進行構造。如果它僅由來自單個維度的一個成員組成(通常稱作簡單元組),則以下語法是可接受的。

          時間.[下半年]
          如果它由來自不止一個維度的成員組成,則元組所表示的成員必須括在圓括號內,如以下示例所示。

          (時間.[下半年], 路線.非陸地.航空)
          由單個成員組成的元組也可括在圓括號內,但這不是必需的。元組常常編組成集合,以便在 MDX 查詢中使用。

          7:集合
          集合是零個、一個或多個元組的有序集合。集合最常用于在 MDX 查詢中定義軸維度和切片器維度,并且同樣可能只具有單個元組或可能在某些情況下為空。下面的示例顯示具有兩個元組的集合:

          { (時間.[上半年], 路線.非陸地.航空), (時間.[下半年], 路線.非陸地.海路) }
          一個集合可包含同一個元組不止一次的出現。下面的集合是可接受的:

          { 時間.[下半年], 時間.[下半年] }
          集合指以元組表示的一組成員組合,或指集合中的元組所代表的單元中的值,視集合使用的上下文而定。

          在 MDX 語法中,元組用花括號括起來以構造集合。


          重要 由單個元組組成的集合不是元組;MDX 將其解釋為集合。某些 MDX 函數接受元組作為參數,而如果傳遞單個元組集合,則會產生錯誤。元組和單個元組集合不可互換。

          8:基本 MDX 查詢
          基本多維表達式 (MDX) 查詢以與下面的示例類似的方式進行構造:

          SELECT [<axis_specification>
          [, <axis_specification>...]]
          FROM [<cube_specification>]
          [WHERE [<slicer_specification>]]
          基本 MDX 語法——SELECT 語句

          在 MDX 中,SELECT 語句用于指定包含多維數據的子集的數據集。為討論 MDX SELECT 語句的各種語法元素,本主題提出一個基本 MDX 查詢示例并將其分解為本身的各種語法元素以討論各個元素的用途和結構。

          若要指定數據集,MDX 查詢必須包含有關下列各項的信息:

          軸的數目。最多可在 MDX 查詢中指定 128 個軸。
          要包括在 MDX 查詢的各個軸上的來自各個維度的成員。
          設置 MDX 查詢上下文的多維數據集的名稱。
          來自切片器維度的成員,在該維度上對來自軸維度的成員進行數據切片。
          這些信息可能很復雜。如您在本主題中將看到的,MDX 語法可以簡單且直觀的方式使用 MDX SELECT 語句提供這類信息。

          基本 MDX 查詢示例

          以下 MDX 查詢示例用于討論基本的 MDX SELECT 語句語法的各個部分:

          SELECT
          { [Measures].[Unit Sales], [Measures].[Store Sales] } ON COLUMNS,
          { [Time].[1997], [Time].[1998] } ON ROWS
          FROM Sales
          WHERE ( [Store].[USA].[CA] )
          9:DrilldownLevel
          將集合的成員深化到集合中所表示的最低級別的下一級,或者深化到集合中所代表的一個任意指定的成員級別的下一級。

          語法

          DrilldownLevel(«Set»[, {«Level» | , «Index»}])

          返回集合的按層次結構排列的成員,該集合在 Set 中指定,比集合中所表示的最低級別低一級,或者比通過Level 中的引用或通過 Index 中基于零的索引指定的任意級別低一級,是集合中所表示的一個成員。

          示例

          以例返回集合 {USA, CA, <all cities in CA>, WA, <all cities in WA>, Canada}:

          DrilldownLevel({[Customers Location].USA, [Customers Location].CA,
          [Customers Location].WA, [Customers Location].Canada})
          主站蜘蛛池模板: 台东市| 平顶山市| 鄂州市| 霸州市| 新竹县| 绍兴市| 东阳市| 阳朔县| 呼伦贝尔市| 神农架林区| 清流县| 常宁市| 绥江县| 米林县| 乐都县| 平安县| 玛纳斯县| 隆安县| 大理市| 高平市| 通化市| 衡南县| 文登市| 得荣县| 沙洋县| 内丘县| 隆林| 台前县| 伊金霍洛旗| 新乡县| 徐水县| 京山县| 东丽区| 广东省| 宁陕县| 安达市| 临高县| 岚皋县| 碌曲县| 融水| 张家界市|