一个简单的MDX问题

时间:2009-02-25 17:22:23

标签: sql-server-2005 olap mdx

我是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 个答案:

答案 0 :(得分:1)

看看MDX功能FILTER - 这可能会为您提供所需的功能。 FILTER和成员属性的组合可以对ID进行过滤。你遇到了一个问题,因为你要做的事情与OLAP多维数据集的结构有点不同(根据我的经验),因为Age和Gender都是同一维度的成员(Answers),这意味着他们每个人都有自己的细胞进行聚合,但不同的是,如果年龄和性别各自都在他们自己的维度上,他们就不会相互聚合,除非加在一起。在OLAP多维数据集中,每个维度的每个成员与每个其他维度的每个成员的每个组合都会获得一个“单元格”,其中每个度量的值对于该组合​​是唯一的 - 这就是您想要的,但是同一维度的成员(例如答案)不会以这种方式交叉计算。

如果可能的话,我会建议将各个答案分解为各个维度,即年龄和性别各自都有自己的成员,那么你想要做的事情自然会流出你的立方体。否则,我担心你会有很多MDX fiddelry要做。 (不过我不是MDX专家,所以我可以完全脱离这个,但这是我的理解)

另外,请务必阅读前面提到的书籍MDX Solutions,除非这是您认为需要编写的唯一MDX查询。 MDX和多维分析像SQL一样 nothing ,对OLAP数据库和MDX的结构有一个绝对的理解是绝对必要的,而且这本书非常非常好地帮助你需要在那个部门。

答案 1 :(得分:0)

当试图弄清楚where-criteria或slice的问题时,我发现将你正在切片的项目细分为维度而非度量是有帮助的。

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

会给你一个数据透视表(或交叉表)按年龄段(在行上)分解性别(在列上)。

BTW - 如果你正在学习MDX这本书:MDX Solutions是我发现的最好的起点。

答案 2 :(得分:0)

首先感谢大家的回复。这是一个有趣的解决方案,对于任何刚接触MDX并且来自SQL的人来说,这是一个容易陷入的陷阱。

因此,对于那些感兴趣的人来说,这是解决方案的简要概述。

我有3张桌子

  1. factDemographics:持有受访者及其答案(谁回答了什么)

  2. dimAnswer:答案

  3. dimRespondent:受访者

  4. 在多维数据集的数据源视图中,我使用命名查询重复了factDemographics 5次,并命名为fact1,fact2,...,fact5。 (将创建5个度量组)

    使用VS Studio的创建立方体向导,我设置了以下事实表

    1. fact1,fact2,...作为事实表
    2. dimRespondent一个事实表。我使用此表来获取受访者的数量。
    3. 删除了原始的factDemographics表。
    4. 创建立方体后,我将dimAnswer维度复制了5次,命名为filter1,filter2,...

      最后在Cube Structure的Dimension Usage选项卡中,我将它们链接在一起,如下所示

      filter1多对多dimRespondent

      filter2多对多dimRespondent

      filter3多对多dimRespondent

      filter4多对多dimRespondent

      filter5多对多dimRespondent

      filter1常规关系fact1

      filter2常规关系fact2

      filter3常规关系fact3

      filter4 regular relationship fact4

      filter5常规关系fact5

      这使我能够重写我在原帖中使用的查询

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

      我的查询现在最多可以过滤5个问题。

      虽然这有效,但我确信有更优雅的解决方案。如果有人知道那是什么,我很乐意听到它。

      由于

答案 3 :(得分:-1)

如果您使用的是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