2012-04-25 11 views
1

私のデータウェアハウスには、親子階層を作成する次のディメンションがあります。私の問題はこれです。プライマリキーはOfficerPeopleIDです。これは親または子ではありません。親はMgrPeopleIDで、子はPeopleIDです。
ディメンションをPeopleIDに作成するときにデフォルトのキーを変更すると、動作するかのように表示されますが、PeopleIDの複数のコピーが表示されるため、処理中にエラーが発生します。倍数があるのは、それがSCDタイプ2であり、主キー(OfficerPeopleID)が表の代理キーであるためです。プライマリキー以外のフィールドで親子参照を作成しようとしたのは私だけではないことは分かっていますか? ありがとうございました!SSASで親子参照を作成する際の問題

Dimension

答えて

1

私はあなたがそれをやりたいとは思いません。私があなたを正しく理解していれば、PeopleIDはあなたの本来の鍵かあなたのソースシステム鍵であり、OfficerPeopleIDはあなたの代用鍵です。この場合、親代用キーではなく親代理キーを格納する列を持つ必要があります。つまり、テーブルの外部キーを作成することができるはずです。あなたが現在持っているものに基づいて、マネージャのために複数のレコードを持つことができます。これは、正しいレコードであるレコードがあいまいになることがあります。また、親の子供があなたを働かせるためには、子供はテーブルのキーでなければなりません。

適切に実行したい場合は、ETLプロセスでMgrOfficerPoepleID(新しい列)を入力する必要があります。それを行う場合は、SCD2のために新しい行があるときにマネージャーキー値を更新するようにしてください。あなたはまだSSAS DSVで名前付きクエリとしてそれを行いたい場合は、あなたがPeopleIDはどちらか、重複したレコードが含まれている場合は、それを一意にするか、あなたが作成することを行うカントこの

SELECT   
    OffcerPeopleID, 
    -- ... insert other columns here 
    PeopleID, 
    MgrPeopleID, 

    (SELECT OfficerPeopleID 
    FROM dbo.Employee 
    WHERE(e.MgrPeopleID = PeopleID) AND (IsCurrent = 1)) AS MgrOfficerPoepleID 
FROM dbo.OfficerPeopleDim AS e 
WHERE IsCurrent = 1 -- this is your SCD2 flag. you could also use two date range columns 
+0

ありがとうございます!私は、あなたが言ったように、そして親のサロゲートキーを格納する列を持つことが、私にとって最高のシナリオだと信じています。どのように私がそれについて行くことができるかについての提案があれば、私はそれを感謝します! – John

+0

私は入り込んでDSVを介して列を追加することができますが、私は親代理キーとなるものをどのように設定するのかは分かりません – John

+0

ちょっとジョンが上記の変更を参照してください –

0

ような何かを行うことができます両方のフィールドを使用して

私はまた、このようなクエリで、DSV上の2つの個別のエントリ、管理者用と従業員のために別のものを作成することをアドバイス:

マネージャー:

select PeopleID as ManagerID, name as Name from OfficerPeopleDim 

は従業員:

select PeopleID as EmployeeID, name, MgrPeopleId as Manager 
from OfficerPeopleDim 
where MgrPeopleId is not null 

これは(左)のようになり、右側に結果が表示されます: enter image description here

+0

私は彼が上記を行うことはできないと思います。ディメンションに参加するには、代理キー(OfficerPeopleID)が必要です。ダイアグラムに代理キーがありません。また、2番目のクエリでは、従業員でもある管理者自身を見逃すことになります。彼は単純にマネージャの代理キーを追加することで問題を解決することができ、それは以下で説明するように真の外部キーになります。 –

関連する問題