試行しているように見える階層のタイプは、親子ディメンションと呼ばれます。SSASは、再帰的結合を使用して、データをツリー形状に「分解」します。
しかし、あなたが説明するあなたのテーブルは少し混乱しています。だから私はあなたがあなたのテーブルを少し再考することを要求する解決策を提供しています。従来の親子は、階層内のノード(レコード)ごとに次のようになります。
- ノードのキー(ID)
- ノードのリテラルテキスト(名前)
- 親と呼ばれる外部キー
あなたの例では、「親」というラベルの付いた列は不要に見えます。例の最後の列(「CatID」と呼ばれます)は、ディメンションの親が通常どのように見えるかを示しています。テーブル内の各レコードが「子」であると考える場合、子の親は、そのレコードを所有または含むレコードへのポインタとして機能します。階層の最上位レベルでは、レコードに親がないため、親列はNULLに設定されます。
2番目の「CatID」の名前を「parent」に変更し、「Parent」という元の列を削除または名前変更します(不要です)。私が提案するようにテーブルを微調整する場合は、次のクエリを実行して、最高レベルが正しいことを確認する必要があります。
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)
再帰的なINNERJOINに注意してください。少なくとももう1つのクエリを実行して別のレベルを表示し、キーが期待どおりに「拡張」していることを確認します。
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が親子階層を構築するときに実行していることです。
最後に、このテーブルをDSVに追加し、親子ディメンションを作成します。それはもう少し複雑で、これは素晴らしいスターター記事のように見えます。SSASは、データがなくなるまで、必要に応じてレベルを追加し続けます。