2009-02-25 68 views
1

我是MDX的新手,我知道这一定是一个简单的问题,但我一直无法找到答案。一个简单的MDX问题

我正在模拟一个有问题和答案的调查问卷。我试图达到的目标是找出为问题提供特定答案的人数。男子的数目岁当我运行下面的单独正确的结果返回

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

[Measures].[Fact Demographics Count]问题查询20-25之间

是主键列的计数

[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

任何帮助如果您使用MSSQL不胜感激

感谢

回答

0

首先感谢大家对他们的答复。这是一个有趣的解决方案,对于任何新来MDX和来自SQL的人来说,它都是一个简单的陷阱。

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

我有3个表

  1. factDemographics:持有受访者和他们的答案(谁回答了什么)

  2. dimAnswer:答案

  3. dimRespondent:受访者

在c的数据源视图中但是我使用命名查询复制了事实统计信息5次,并将这些事实命名为fact1,fact2,...,fact5。 (这将创造5个测度组)

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

  1. fact1,fact2,......事实上表
  2. dimRespondent一个事实表。我使用这个表格来获得受访者的人数。
  3. 删除了最初的factDemographics表。

一旦立方体创建我复制了dimAnswer尺寸的5倍,给它们命名过滤器1,过滤器2,...

终于在多维数据集结构的维度使用标签我联系这些结合在一起如下

过滤器1多对多dimRespondent

过滤器2多对多dimRespondent

过滤器3多对多dimRespondent

过滤器4多对多dimRespondent

filter5多对多dimRespondent

过滤器1定期关系fact1

过滤器2规律可循fact2

过滤器3的常规关系fact3

过滤器4的常规关系fact4

filter5规律可循fact5

现在,这让我重写我在原来的职位作为

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

我的查询,现在可以通过多达5个问题进行过滤查询。

虽然这有效,但我确信有一个更优雅的解决方案。如果有人知道我喜欢听什么。

谢谢

-1

,您可以使用“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 
+0

为什么这个投票被拒绝?这是做到这一点的简单方法!当你需要的只是一个简单的分组语句时,为什么要处理复杂的MDX编码? – Jasmine 2009-02-25 19:48:34

1

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

如果可能的话,我会建议打破了个人的回答到各个维度,即年龄和性别每个人都有自己的尺寸与自己的成员,那么你想要做的,自然会流出来多维数据集的内容。否则,恐怕你会有很多MDX fiddelry要做。 (我不是MDX专家,所以我可以完全脱离这个基础,但这是我的理解)

此外,绝对读了前面提到的书,MDX Solutions,除非这是唯一的MDX查询你认为你需要写作。 MDX和多维分析是什么像SQL,和一般的OLAP数据库和MDX的结构有深刻的理解是绝对必要的,这本书并让你的一个非常,非常漂亮的工作,你需要在这部。

0

当试图找出与地方的准则或切片我发现它有助于击穿,你切片上为维度,而不是措施的项目问题。

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 - FF你学习MDX这本书:MDX Solutions是远远地,我已经找到了最好的切入点。

+0

肯定购买MDX解决方案并阅读它。优秀的资源。 – Nathan 2009-02-25 18:30:49