MDX: отфильтровать несуществующего участника? - PullRequest
0 голосов
/ 04 февраля 2009

Я новичок в MDX, поэтому я предполагаю, что это вопрос новичка.

Существующее измерение: статус Существующая мера: count

Существующий запрос:

SELECT 
  NON EMPTY [status].CHILDREN ON 0,
  NON EMPTY Measures.count ON 1
FROM [objects]

Я хочу посчитать записи со статусом = 'C'. Но иногда нет записей, соответствующих этому критерию. Так что если я сделаю:

SELECT 
  NON EMPTY [status].[C] ON 0,
  NON EMPTY Measures.count ON 1
FROM [objects]

Я получаю эту ошибку:

*MDX object '[status].[C]' not found in cube 'objects'*

Я хотел бы запрос, который возвращает 0 в этом случае. Какой правильный способ сделать этот запрос?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 22 апреля 2009

Из вашего вопроса я предполагаю, что на самом деле у вас нет таблицы измерений Status в вашем источнике данных. Вместо этого у вас есть определенное измерение, которое использует столбец в таблице фактов. Это прекрасно работает, но не позволяет вам определить фиксированный набор членов для этого измерения ... вы в основном застряли на фактах, которые у вас есть.

Решение, как я вижу, состоит в том, чтобы создать отдельную таблицу с именем DimStatus и предварительно заполнить ее всеми действительными состояниями, которые могут использоваться вашими фактами, и иметь таблицу фактов, ссылающуюся на измерение Status Таблица.

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

Одно предостережение заключается в том, что он будет показывать (ноль) вместо 0, если нет соответствующих фактов. Вы можете обойти это с помощью простого ИИФ (ISEMPTY ()):

WITH MEMBER
    [ZeroCount] AS
        IIF(ISEMPTY([Measures].[Count]), 0, [Measures].[Count])
SELECT [ZeroCount] ON COLUMNS,
[Status].Members on ROWS
FROM [MyCube]

Это покажет все статусы и либо количество, либо ноль. К сожалению, это требует изменений в вашем источнике данных и кубе, так что, надеюсь, это вариант для вас.

Я играл с некоторыми запросами, и я не думаю, что это можно сделать проще. Вы не можете создать набор с недопустимыми членами - это создаст недопустимые кортежи, и ничего не будет работать должным образом. Я также попробовал "взломать", и не получил его работать, как ожидалось.

2 голосов
/ 05 февраля 2009

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

В следующей статье перечислены различные способы получения метаданных измерения текст ссылки

другой «взлом» может заключаться в следующем:

SELECT
  NON EMPTY StrToSet("[status].[C]") ON 0,
  NON EMPTY Measures.count ON 1
FROM [objects]

Но это все равно не даст вам 0, вместо этого он даст вам набор ячеек без столбцов. И это не совсем подход, который я бы порекомендовал.

0 голосов
/ 19 февраля 2019

Решением является использование динамических наборов (CREATE DYNAMIC SET). Они оцениваются на основе разрешений пользователей.

WITH DYNAMICS SET [MySet] {[status].[C]}    
SELECT
  NON EMPTY [MySet] ON 0,
  NON EMPTY Measures.count ON 1
FROM [objects]

Но, как указано выше, это решает только фильтрацию, но при этом вы пропускаете любой элемент по оси 0 для отображения.

...