2015-11-03 10 views
5

Ich habe schwer Zeit zu verstehen, wie man Ergebnis von multidimensionalen Ausdruck herausfiltern kann.Filterung von Viele-zu-Viele-Tabelle

Dies ist mein Datenbankschema.

A simple database schema

Und das ist meine Daten.

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 ║ 
╚════╩═════════════╝ 

Ich importierte alles in die tabellarische Modelllösung. Danach, habe ich zwei Maßnahmen:

  • Tabelle Item: ItemStock: = SUM ([Stock])
  • Tabelle Teil: PartStock: = SUM ([Stock])

Dann habe ich den Würfel auf dem Server bereitgestellt.

indem Sie die folgende MDX-Abfrage ...

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

... Ich erhalte diese resultset ...

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

... was in Ordnung ist.

Wenn jedoch diese MDX-Abfrage läuft ...

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

... Ich bekomme diese resultset ...

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

Ich hatte erwartet, dass Gegenstände auf die ItemStock Tabelle würde durch Teil Tabelle als eine Viele-zu-Viele-Beziehung herausgefiltert werden. Z.B. MBO, Prozessor und Adapter haben Verweise auf Artikel 1 und 4, so wäre das Ergebnis um sie gezwungen werden, und das Ergebnis sollte so ausfallen:

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

Was mache ich falsch?

+1

Antwort auf die Frage, die Sie auf DBA gepostet: http://dba.stackexchange.com/questions/119909/filtering-by-many-to-many-table – GregGalloway

Antwort

0

MDX ist für mich unbekannt, aber hier ist eine reine SQL-Erklärung.

Ihr Modell ist tatsächlich so:

Link to image

Um [Artikel] zu erhalten für [Teile] mit spesific [Status] Ich kann das reine SQL zu verwenden:

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

I kann in Ihrem Beispiel sehen, dass Sie FROM [Model] verwenden, aber Sie haben keine Tabelle mit dem Namen Model in Ihrem Setup - also könnte dies eine VIEW oder eine Funktion für MDX sein, die Sie untersuchen sollten. Es könnte sein, dass der JOIN zwischen Tabellen für die Ansicht [Model] falsch ist.