2015-11-03 14 views
5

多次元表現の結果をフィルタリングする方法を理解するのは難しい時間です。多対多テーブルによるフィルタリング

これはデータベーススキーマです。

A simple database schema

そして、これは私のデータです。

Manufacturer 
╔════╦═══════════════════╗ 
║ Id ║  Name  ║ 
╠════╬═══════════════════╣ 
║ 1 ║ Awesome Computers ║ 
║ 2 ║ TailSpin Toys  ║ 
╚════╩═══════════════════╝ 

Item 
╔════╦═════════╦════════════════╦═══════╗ 
║ Id ║ Name ║ ManufacturerId ║ Stock ║ 
╠════╬═════════╬════════════════╬═══════╣ 
║ 1 ║ PC  ║    1 ║ 40 ║ 
║ 2 ║ Server ║    1 ║ 10 ║ 
║ 3 ║ STB  ║    2 ║ 80 ║ 
║ 4 ║ Console ║    2 ║ 50 ║ 
╚════╩═════════╩════════════════╩═══════╝ 

Part 
╔════╦══════════════════╦════════╦══════════╦═══════╗ 
║ Id ║  Name  ║ ItemId ║ StatusId ║ Stock ║ 
╠════╬══════════════════╬════════╬══════════╬═══════╣ 
║ 1 ║ MBO    ║  1 ║  1 ║ 100 ║ 
║ 2 ║ Processor  ║  1 ║  1 ║ 100 ║ 
║ 3 ║ Server MBO  ║  2 ║  2 ║ 20 ║ 
║ 4 ║ Server processor ║  2 ║  2 ║ 20 ║ 
║ 5 ║ Main box   ║  3 ║  2 ║ 40 ║ 
║ 7 ║ Adapter   ║  3 ║  3 ║ 30 ║ 
║ 8 ║ Controller  ║  4 ║  2 ║ 40 ║ 
║ 10 ║ Adapter   ║  4 ║  1 ║ 60 ║ 
║ 11 ║ Memory card  ║  4 ║  2 ║ 80 ║ 
╚════╩══════════════════╩════════╩══════════╩═══════╝ 

Status 
╔════╦═════════════╗ 
║ Id ║ Name  ║ 
╠════╬═════════════╣ 
║ 1 ║ No data  ║ 
║ 2 ║ Available ║ 
║ 3 ║ Unavailable ║ 
╚════╩═════════════╝ 

すべてを表形式モデルのソリューションにインポートしました。

  • 表アイテム:ItemStock:SUM([在庫])=
  • 表パート:PartStock:SUM([在庫])=
この後、私は2つの尺度を作成しました

次に、キューブをサーバーに展開しました。大丈夫です、次のMDXクエリを実行することにより

...

SELECT 
    NON EMPTY { 
     [Part].[Name].CHILDREN 
    } ON ROWS, 
    { 
     [Measures].[PartStock] 
    } ON COLUMNS 
FROM [Model] 
WHERE (
    { 
     [Status].[Id].&[1] 
    } 
) 

...私は、この結果セットを取得...

╔═══════════╦═══════════╗ 
║   ║ PartStock ║ 
╠═══════════╬═══════════╣ 
║ Adapter ║  60 ║ 
║ MBO  ║  100 ║ 
║ Processor ║  100 ║ 
╚═══════════╩═══════════╝ 

...。

...

SELECT 
    NON EMPTY { 
     [Item].[Name].CHILDREN 
    } ON ROWS, 
    { 
     [Measures].[ItemStock] 
    } ON COLUMNS 
FROM [Model] 
WHERE (
    { 
     [Status].[Id].&[1] 
    } 
) 

このMDXクエリを実行するときしかし、...私はItemStockテーブル内の項目があろうと期待していた...

╔═════════╦═══════════╗ 
║   ║ ItemStock ║ 
╠═════════╬═══════════╣ 
║ Console ║  50 ║ 
║ PC  ║  40 ║ 
║ Server ║  10 ║ 
║ STB  ║  80 ║ 
╚═════════╩═══════════╝ 

をこのResultSetを取得していますPartテーブルによって、多対多の関係として除外されます。例えば。結果は、それらに制約されることになるので、MBO、プロセッサ及びアダプタは、項目1と4を参照している、そしてその結果は次のように判明する必要があります:私は間違って何をやっている

╔═════════╦═══════════╗ 
║   ║ ItemStock ║ 
╠═════════╬═══════════╣ 
║ Console ║  50 ║ 
║ PC  ║  40 ║ 
╚═════════╩═══════════╝ 

+1

DBAに投稿した質問に回答してください:http://dba.stackexchange.com/questions/119909/filtering-by-many-to-many-table – GregGalloway

答えて

0

MDXは私にとっては不明ですが、ここでは純粋なSQLの説明です。

あなたのモデルは次のように実際にある:

SELECT Item.Name 
FROM Item INNER JOIN Part ON Item.Id = Part.ItemID 
WHERE Part.StatusID = 1; 

I:

Link to image

が、私はこの純粋なSQLを使用する場合とspesific [状態]と[部品]のための[アイテム]を取得するにはサンプルでFROM [Model]を使用していることがわかりますが、セットアップにModelという名前のテーブルはありません。このため、VIEWやMDXの機能があります。 [モデル]ビューでテーブル間のJOINが間違っている可能性があります。

関連する問題