Фильтрация по таблице "многие ко многим"

Мне трудно понять, как отфильтровать результат многомерного выражения.

Это моя схема базы данных.

Простая схема базы данных

И это мои данные.

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 ([Stock])
  • Деталь таблицы: PartStock: = SUM ([Stock])

Затем я развернул куб на сервере.

Выполнив следующий запрос многомерных выражений ...

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]
    }
)

... Я получаю этот результат ...

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

Я ожидал, что элементы в таблице ItemStock будут отфильтрованы таблицей Часть как отношение «многие ко многим». Например. MBO, процессор и адаптер имеют ссылки на элементы 1 и 4, поэтому результат будет ограничен ими, и результат должен быть таким:

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

Что я делаю неправильно?


person OzrenTkalcecKrznaric    schedule 03.11.2015    source источник
comment
Ответ на вопрос, который вы отправили администратору базы данных: dba.stackexchange.com/questions/119909/   -  person GregGalloway    schedule 03.11.2015


Ответы (1)


Мне неизвестны многомерные выражения, но вот объяснение на чистом языке SQL.

Ваша модель на самом деле такая:

Ссылка на изображение

Чтобы получить [Items] для [Parts] со специальным [Status], я бы использовал этот чистый SQL:

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

В вашем примере я вижу, что вы используете FROM [Model], но у вас нет таблицы с именем Model в вашей настройке - так что это может быть VIEW или некоторые функции для MDX, которые вы должны изучить. Может случиться так, что JOIN между таблицами неверен для представления [Model].

person Kjell Inge Hestad    schedule 06.01.2016