2013-03-07 54 views
3

我有如下表:分析服務中創建遞歸層次結構

CatId CatName parent  CatId 

1  Category 1   NULL 
2  Category 2   NULL 
3  SubCat  1   1 
4  SubSubCat 1   3 
5  SSSubCat 1   4 

在分析服務我想在維度來建立層次結構,使得它可以讓我鑽下來,直到氮水平。目前我能做到這一點只有2級..類別和次級類別..但我想要去N級,如果N級是不可能的,至少有4-5級。

回答

2

您似乎嘗試的層次類型稱爲父子維度。 SSAS將使用遞歸連接將數據「分解」爲樹狀。

但是您描述的表格有點令人困惑。所以我提供的解決方案需要你重新考慮一下你的桌子。一個經典的父子將有層次結構中的每個節點(記錄):爲節點

  • 爲節點
  • 外鍵的文字文本(名稱)稱爲

    • 的關鍵(ID)父母

    在您的示例中,標記爲「父母」的列似乎是多餘的。您示例中的最後一列(稱爲「CatID」)是維度的父類通常看起來像的內容。如果您認爲表中的每條記錄都是一個「孩子」,則該孩子的父母將充當指向擁有或包含該記錄的某條記錄的指針。在層次結構的最高級別中,記錄不會有父項,因此父項列設置爲NULL。

    將第二個「CatID」重命名爲「父」,並刪除或重命名名爲「父」的原始列(您不需要它)。如果你調整你的表,我建議,你應該檢查的最高級別是通過運行下面的查詢正確的:

    SELECT CatID, CatName, parent FROM mytable WHERE (parent IS NULL) 
    

    然後得到一個新的水平下降運行以下查詢:

    SELECT HighestLevel.CatID, HighestLevel.CatName, HighestLevel.parent, Level2.CatID AS Level2ID, Level2.CatName AS Level2Name 
    FROM mytable AS HighestLevel 
    INNER JOIN mytable AS Level2 ON HighestLevel.CatID = Level2.parent 
    WHERE (HighestLevel.parent IS NULL) 
    

    注意遞歸INNER JOIN。運行至少一個或多個查詢,查看另一個水平降低到驗證密鑰「擴」你期望的方式:

    SELECT HighestLevel.CatID, HighestLevel.CatName, HighestLevel.parent, Level2.CatID AS Level2ID, Level2.CatName AS Level2Name, Level3.CatID AS Level3ID, Level3.CatName AS Level3Name 
    FROM mytable AS HighestLevel 
    INNER JOIN mytable AS Level2 ON HighestLevel.CatID = Level2.parent 
    INNER JOIN mytable AS Level3 ON Level2.CatID = Level3.parent 
    WHERE (HighestLevel.parent IS NULL) 
    

    你可以不斷添加必要的水平,以說服自己的數據是正確的。這基本上是SSAS在構建Parent-Child層次結構時所做的。

    最後,您將此表添加到DSV並創建父親維度維度。這有點複雜,看起來像a great starter article。 SSAS將根據需要繼續添加級別,直到數據用完。

  • 2

    在AdventureWorks中,員工維度就是一個例子。假設你的類是事實表:

    • 設置你的ParentCatID是CATID的FK在DSV
    • 參考您的parent屬性作爲維度Hierarcy經理parent屬性類型
    • 添加屬性到您的層次結構

    嵌套的級別應該能夠在您的類別層次結構中瀏覽。