Вопрос

Я новичок в 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

Таблица фактов имеет следующую структуру:

ФактДемографияКлюч,

РесподентКей,

ВопросКлюч,

ОтветКлюч

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

Спасибо

Это было полезно?

Решение 3

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

Итак, для интересующихся вот краткий обзор решения.

у меня есть 3 стола

  1. фактДемография:содержит респондентов и их ответы (кто на что ответил)

  2. димОтвет:ответы

  3. dimОтветчик:респонденты

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Спасибо

Другие советы

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

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

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

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

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 это, безусловно, лучшая отправная точка, которую я нашел.

Если вы используете 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top