MDX, ГДЕ НЕ IN () эквивалентен в измерении «многие ко многим» - PullRequest
3 голосов
/ 16 декабря 2009

У меня есть измерение многие ко многим в моем кубе (рядом с другими обычными измерениями). Когда я хочу исключить строки фактов в моей мере подсчета строк, я обычно делаю что-то вроде следующего в MDX

SELECT [Measures].[Row Count] on 0
FROM cube
WHERE ([dimension].[attribute].Children - [dimension].[attribute].&[value])

В этом простом примере это может показаться более сложным, чем необходимо, но в этом случае ГДЕ может иногда расти, включая UNION.

Так что это работает для обычных измерений, но теперь у меня есть измерение многие ко многим. Если я выполняю описанный выше трюк, он не дает желаемого результата, а именно я хочу исключить все строки, имеющие этот определенный атрибут, в измерении «многие ко многим».

На самом деле он выполняет именно то, что запрашивает MDX, а именно подсчитывает все строки, но игнорирует указанный атрибут. Поскольку строка в таблице фактов может иметь несколько атрибутов в измерении «многие ко многим», строка все равно будет учитываться.

Это не то, что мне нужно, это нужно для явного исключения строк, имеющих значение этого атрибута измерения. Также я могу исключить несколько значений. Так что мне нужно что-то похожее на T-SQL, где ... НЕ В (...)

Я понимаю, что могу просто вычесть результирующие значения из [attribute] .all и [attribute]. & [Value], но это больше не сработает при объединении нескольких операторов WHERE.

У кого-нибудь есть хорошая идея, как решить эту проблему?

Заранее спасибо,

Delta

Ответы [ 3 ]

1 голос
/ 02 августа 2011

Я не проверял это, но я думаю, что вы могли бы сделать это, если бы у вас был атрибут, который был на том же уровне детализации, что и строки (поэтому, вероятно, реализован как связь фактов).

Таким образом, если вы хотите посчитать количество заказов, в которых НЕ имеется категория продуктов с байками (при условии отношения M2M между OrderID и Category), то должно сработать что-то вроде следующего. (вы можете найти больше информации о функции EXISTS в Books Online)

[Orders].[Order ID].[Order ID].Members 
- EXISTS([Orders].[Order ID].[Order ID].Members
       , [Product].[Category].&[Bikes]
       , "Order Facts")

Хотя это может быть довольно медленным, так как такого рода запросы заставляют движок SSAS собирать множество фактов с низкого уровня.

0 голосов
/ 06 июня 2012

Вы можете использовать функцию фильтра:

SELECT [Measures].[Row Count] on 0
FROM [cube]
WHERE Filter([dimension].[attribute].Children, [dimension].CurrentMember.MemberValue <> value)
0 голосов
/ 16 декабря 2009

Вы пробовали команду EXCEPT? Его синтаксис выглядит следующим образом:

EXCEPT({the set i want}, {a set of members i dont want})

...