1

我是 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,

问题键,

答案键

任何帮助将不胜感激

谢谢

4

4 回答 4

1

看看 MDX 函数 FILTER - 这可能会给你你需要的东西。结合过滤器和成员属性来过滤 ID 可能会做到这一点。您遇到了问题,因为您尝试做的事情有点违背 OLAP 多维数据集的结构(根据我的经验),因为 Age 和 Gender 都是同一维度的成员(Answers),这意味着它们每个都有自己的单元格进行聚合,但与 Age 和 Gender 各自在自己的维度上不同,它们不会相互聚合,除非加在一起。在 OLAP 多维数据集中,每个维度的每个成员与每个其他维度的每个成员的每个组合都会获得一个“单元格”,其中包含对该组合唯一的每个度量值的值 - 这就是您想要的,

如果可能的话,我建议将单独的答案分解成单独的维度,即 Age 和 Gender 都有自己的维度和自己的成员,那么你想做的事情自然会从你的立方体中流出。否则,恐怕您将有大量的 MDX 小提琴工作要做。(不过,我不是 MDX 专家,所以我可能完全不了解这个,但这是我的理解)

另外,一定要阅读前面提到的书,MDX 解决方案,除非这是您认为需要编写的唯一 MDX 查询。MDX 和多维分析与 SQL 完全不同,对 OLAP 数据库的结构和 MDX 的一般结构的深刻理解是绝对必要的,这本书非常非常好地让你在那个部门中达到了你需要的位置

于 2009-02-25T17:37:23.530 回答
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] )

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

顺便说一句 - 如果您正在学习 MDX 这本书:MDX Solutions无疑是我发现的最佳起点。

于 2009-02-25T17:56:22.143 回答
0

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

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

我有 3 张桌子

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

  2. dimAnswer: 答案

  3. dimRespondent:受访者

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

使用 VS Studio 的创建多维数据集向导,我设置了以下事实表

  1. fact1, fact2, ... 作为事实表
  2. dimRespondent 一个事实表。我使用此表来获取受访者的数量。
  3. 删除了原来的 factDemographics 表。

创建多维数据集后,我将 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 正则关系 fact4

filter5 正则关系 fact5

现在,这使我能够将我在原始帖子中使用的查询重写为

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

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

虽然这可行,但我确信有一个更优雅的解决方案。如果有人知道那是什么,我很想听听。

谢谢

于 2009-02-26T16:48:16.917 回答
-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
于 2009-02-25T17:31:37.710 回答