Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 一个简单的MDX问题_Sql Server 2005_Olap_Mdx - Fatal编程技术网

Sql server 2005 一个简单的MDX问题

Sql server 2005 一个简单的MDX问题,sql-server-2005,olap,mdx,Sql Server 2005,Olap,Mdx,我是MDX新手,我知道这一定是一个简单的问题,但我还没有找到答案 我正在模拟一个包含问题和答案的调查问卷。我想做的是找出对问题给出具体答案的人数,例如20-25岁的男性人数 当我单独运行下面的问题查询时,将返回正确的结果 SELECT [Measures].[Fact Demographics Count] ON Columns FROM [Dsv All] WHERE [Answer].[Dim Answer].&[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

事实表的结构如下所示

事实人口统计

RespodentKey

问题键

回答键

任何帮助都将不胜感激


谢谢

如果您使用的是MSSQL,您可以使用“WITH ROLLUP”获得一些额外的行,这些行将包含您想要的信息。此外,您没有使用需要的“分组依据”

使用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

看看MDX函数过滤器-这可能会提供您所需要的。组合使用筛选器和成员属性来根据ID进行筛选可能会做到这一点。您遇到了一个问题,因为您试图做的有点违背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新手和来自SQL的人来说,这是一个很容易陷入的陷阱

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

我有三张桌子

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

  • 答案:答案

  • 被调查者:被调查者

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

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

  • 事实1,事实2。。。作为事实表
  • 这是一个事实表。我用这个表来计算受访者的数量
  • 删除了原始的factDemographics表
  • 创建多维数据集后,我将dimAnswer维度复制了5次,分别命名为filter1、filter2

    最后,在多维数据集结构的维度使用选项卡中,我将它们链接在一起,如下所示

    过滤器1多对多系统

    过滤器2多对多系统

    过滤器3多对多系统

    过滤器4多对多

    过滤器5多对多

    过滤器1常规关系事实1

    过滤器2常规关系事实2

    过滤器3常规关系事实3

    过滤器4常规关系事实4

    过滤器5常规关系事实5

    现在,我可以将我在原始帖子中使用的查询重写为

    SELECT
        [Measures].[Dim Respondent Count] On 0
    FROM
        [DemographicsCube]
    WHERE
        (
            [Filter1].[Answer].&[Male],
            [Filter2].[Answer].&[20-25]
        )
    
    我的查询现在最多可以通过5个问题进行过滤

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


    谢谢

    一定要购买MDX解决方案并阅读。很好的资源,为什么会被否决?这是最简单的方法!当您只需要一个简单的分组语句时,为什么还要处理复杂的MDX编码呢?!