Простой вопрос MDX - PullRequest
       11

Простой вопрос MDX

1 голос
/ 25 февраля 2009

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

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

Когда я запускаю запрос ниже для вопросов индивидуально, возвращается правильный результат

SELECT
      [Measures].[Fact Demographics Count] ON Columns
FROM
      [Dsv All]            
WHERE
      [Answer].[Dim Answer].&[1]

[Measures].[Fact Demographics Count] - счетчик столбца первичного ключа

[Answer].[Dim Answer].&[1] является ключом для мужского ответа

Результат для числа людей мужского пола = 150 Результат для числа людей, которые между 20-25 = 12

Но когда я запускаю следующий запрос ниже, вместо того, чтобы узнать количество людей мужского пола в возрасте от 20 до 25 лет. Я получаю сумму числа людей мужского пола и числа людей в возрасте от 20 до 25 лет.

SELECT 
      [Measures].[Fact Demographics Count] ON Columns
FROM
      [Dsv All]            
WHERE
      {[Answer].[Dim Answer].&[1],[Answer].[Dim Answer].&[9]}

результат = 162

Структура таблицы фактов

FactDemographicsKey

RespodentKey

QuestionKey

AnswerKey

Любая помощь будет принята с благодарностью

Спасибо

Ответы [ 4 ]

1 голос
/ 25 февраля 2009

Посмотрите на функцию MDX FILTER - это может дать вам то, что вам нужно. Комбинация FILTER и Member Properties для фильтрации по идентификаторам может сделать это. У вас возникла проблема, потому что вы пытаетесь сделать что-то против структуры структурированного куба OLAP (из моего опыта), потому что Age и Gender являются членами одного измерения (ответы), что означает, что каждый из них получает свои собственные ячейки для агрегации, но, в отличие от возраста и пола, каждый из которых имеет свои собственные измерения, они не агрегируются по отношению друг к другу, за исключением того, что их объединяют. В кубе OLAP каждая комбинация каждого элемента каждого измерения с каждым элементом каждого другого измерения получает «ячейку» со значением каждой меры, уникальным для этой комбинации - это то, что вам нужно, но элементы одного измерения (например, Ответы) не рассчитываются таким образом.

Если возможно, я бы рекомендовал разбить отдельные ответы на отдельные измерения, т. Е. У каждого возраста и пола есть свои измерения со своими членами, тогда то, что вы хотите сделать, будет естественно вытекать из вашего куба. В противном случае, я боюсь, у вас будет много возможностей для работы с MDX. (Хотя я не эксперт по MDX, так что я мог бы быть совершенно не основанным на этом, но это мое понимание)

Кроме того, обязательно прочитайте ранее упомянутую книгу, MDX Solutions, если только это не единственный MDX-запрос, который, по вашему мнению, вам нужно написать. MDX и многомерный анализ - ничто , как SQL, и глубокое понимание структуры базы данных OLAP и MDX в целом абсолютно необходимо, и эта книга делает очень, очень хорошую работу, чтобы доставить вас туда, где вам нужно быть в этом отделе.

0 голосов
/ 26 февраля 2009

Во-первых, спасибо всем за ответы. Это было интересно решить, и для любого новичка в MDX, пришедшего из SQL, легко попасть в ловушку.

Так что для интересующихся здесь краткий обзор решения.

У меня есть 3 таблицы

  1. factDemographics: содержит респондентов и их ответы (кто на что ответил)

  2. dimAnswer: ответы

  3. dimRespondent: респонденты

В представлении источника данных для куба я 5 раз дублировал factDemographics, используя именованные запросы, и назвал их fact1, fact2, ..., fact5. (который создаст 5 групп мер)

Используя мастер создания куба VS Studio, я установил следующие таблицы фактов

  1. fact1, fact2, ... как таблицы фактов
  2. dimRespondent таблица фактов. Я использую эту таблицу, чтобы узнать количество респондентов.
  3. Удален исходный фактографический стол.

После создания куба я дублировал измерение dimAnswer 5 раз, назвав их filter1, filter2, ...

Наконец, на вкладке Использование измерения структуры куба я связал их вместе следующим образом

filter1 много ко многим dimRespondent

filter2 много ко многим dimRespondent

filter3 много ко многим dimRespondent

filter4 много ко многим dimRespondent

фильтр5 много ко многим dimRespondent

фильтр1 факт регулярных отношений1

фильтр2 факт регулярных отношений2

фильтр3 факт регулярных отношений3

фильтр4 факт регулярных отношений4

filter5 факт регулярных отношений5

Теперь я могу переписать запрос, использованный в исходном сообщении, как

SELECT
    [Measures].[Dim Respondent Count] On 0
FROM
    [DemographicsCube]
WHERE
    (
        [Filter1].[Answer].&[Male],
        [Filter2].[Answer].&[20-25]
    )

Мой запрос теперь может быть отфильтрован до 5 вопросов.

Хотя это работает, я уверен, что есть более элегантное решение. Если кто-нибудь знает, что это такое, я бы с удовольствием это услышал.

Спасибо

0 голосов
/ 25 февраля 2009

Пытаясь выяснить проблемы с критериями где или срезами, я считаю полезным разбивать элементы, на которые вы нарезаете, на измерения, а не на измерения.

select
      [Measures].[Fact Demographics Count] on Columns
from  [Dsv All]            
where
{
    [Answer].[Dim Answer].&[1],
    [Dim Age Band].[20-25]
}

Хотя тогда вы на самом деле не используете мощь MDX - вы получаете только одно значение.

select
      [Dim Answer].Members on Columns,
      [Dim Age Band].Members on Rows
from  [Dsv All] 
where ( [Measures].[Fact Demographics Count] )

Даст вам сводную таблицу (или перекрестную таблицу) с разбивкой по полу (по столбцам) по возрастным группам (по строкам).

Кстати, если вы изучаете MDX по этой книге: MDX Solutions - лучшая отправная точка, которую я нашел.

0 голосов
/ 25 февраля 2009

Если вы используете MSSQL, вы можете использовать «WITH ROLLUP», чтобы получить несколько дополнительных строк, которые бы содержали необходимую информацию. Кроме того, вы не используете «GROUP BY», который вам понадобится.

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

Пример:

select AGE, GENDER, count(1)
from MY_TABLE
group by AGE, GENDER
with rollup

Это даст вам номер каждого пола человека в вашей таблице в каждой возрастной группе, а "сведение" даст вам общее количество людей в вашей таблице, числа в каждой возрастной группе независимо от пола, и числа каждого пола независимо от возраста. Что-то вроде

AGE GENDER COUNT
--- ------ -----
 20      M  1245
 21      M  1012
 20      F   942
 21      F   838
         M  2257
         F  1780
 20         2187
 21         1850
            4037
...