當人們想起 OLAP 多維數據集的結構時,他們通常想到的是一組分層維度和一組使用求和來確定度量值的度量。多維數據集通常包括通過使用求和來聚合的度量。目前存在各種其他的聚合類型,但 Analysis Services 並非對所有這些類型都提供本機支持。非傳統聚合的一個典型示例是庫存分析。當您分析庫存時,您不需要通過對三個月來的庫存數字求和來確定每個季度的庫存;您只需要使用該季度最後一個月的庫存量。您可以在 Analysis Services 中輕松地實現這種聚合,但它不是您可以選擇的本機聚合類型之一。我們先討論本機類型,然後了解如何實現兩個非本機聚合類型。
首先,我們先提供一些術語。多維數據集單元是多維數據集中的一個位置,各個維度在該位置相交。就像您可以在 X、Y 和 Z 軸上使用數值來標識三維空間中的點一樣,您可以使用每個維度中的成員來標識多維數據集中的單元。因為每個維度都有一個默認的成員,所以您不必顯式列出每個維度的成員,就可以唯一地標識一個多維數據集單元。例如,元組 (USA, Drinks) 足以標識 FoodMart 2000 Sales 多維數據集中的一個唯一單元(雖然 Sales 多維數據集有 12 個維度),因為其他 10 個維度位於其默認成員的位置上(也就是說,它們已經被占用,因此您無需對它們顯式命名)。
每個多維數據集單元對於多維數據集的每個度量都有一個值。有些多維數據集單元的度量值是加載的(也就是說,直接來自源數據),而有些多維數據集單元的度量值則是由聚合來確定的。聚合是 Analysis Services 通過對其他多維數據集單元執行某些數學函數來確定的值。簡言之,任何葉級單元的值都是加載值,這意味著這些值是基於源數據計算的,而不是基於其他單元中的值計算的。非葉級單元值是聚合確定的。葉級單元是完全由最低層的維度成員(沒有子級的維度成員)標識的單元。
ASP?url=/library/en-us/dnsqlmag03/Html/AlternativeAggregationsTable_01.ASP" target="_blank">表 1 顯示了 Analysis Services 的本機聚合類型(數學函數)和它們的說明。非重復計數是一個特殊類型,這裡應該解釋一下。Analysis Services 只允許一個多維數據集中有一個非重復計數度量,而且非重復計數度量的值從不聚合(即從不通過其他單元值來確定)。在處理多維數據集時,Analysis Services 直接從事實數據表派生非重復計數度量值。非重復計數值是由特定多維數據集單元所標識的非重復類型的事實數據表記錄數來確定的。例如,如果多維數據集單元是 (1997, Beverages),則非重復計數就是 1997 年期間在 Beverages 產品類別中出現的不同類型的事實數據表記錄的數量。當您創建非重復計數度量時,應在事實數據表中指定一列,用於確定事實數據表記錄的類型。非重復計數度量不同於典型的計數度量,因為非重復計數不是事實數據表記錄的計數,而是事實數據表中特定列的非重復值的計數。數據庫管理員通常使用非重復計數來確定當一個以上的事實數據表記錄來自同一個事務時存在的唯一事務的數量。
本機聚合類型的一個特征是,Analysis Services 在所有多維數據集維度中用同樣的方式來處理它們。非本機庫存聚合則不具備這一特征。對庫存量進行聚合時,您要對除 Time 維度之外的所有維度使用求和。您可以通過使用最後一個子級(也就是最近的值)對 Time 維度進行聚合。圖 1顯示了 Product 維度如何將各個庫存總數聚合為一個總和,而 Time 維度則使用最後一個子級。
因為 Analysis Services 不提供對最後一個子級聚合的本機支持,所以您不得不自己創建聚合支持。對於如何實現此目的,您可以有幾種選擇。您可以在 Time 維度中使用計算度量、計算單元或自定義匯總公式。我傾向於使用將性能影響限制在多維數據集的最小百分比的方法。例如,FoodMart Sales 多維數據集包含除庫存量度量之外的其他度量,因此我建議挑選一種不向其他度量增加額外處理的方法。Analysis Services 會計算每個度量的自定義匯總公式,因此自定義匯總不是解決這一問題的適當選擇。您可以使用計算單元或計算度量方法來分離聚合處理,這樣它只會影響庫存量度量。當您在計算單元和計算度量之間進行選擇時,您需要考慮兩個情況。注意,計算單元只能隨企業版的 SQL Server 提供。但計算度量在支持鑽取的多維數據集中會出現問題,因為當您指定計算度量作為標識多維數據集的單元的元組(即成員列表)的一部分時,不能使用鑽取操作。
為了進行庫存分析,我建議使用計算度量,這只是因為大多數 OLAP 前端工具都提供了創建計算度量的功能。例如,當您在 FoodMart Sales 多維數據集中使用以下計算度量公式時,它返回 [Unit Sales],就好象它是庫存量一樣: