Sql server 2005 一个简单的MDX问题
我是MDX新手,我知道这一定是一个简单的问题,但我还没有找到答案 我正在模拟一个包含问题和答案的调查问卷。我想做的是找出对问题给出具体答案的人数,例如20-25岁的男性人数 当我单独运行下面的问题查询时,将返回正确的结果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] [
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的人来说,这是一个很容易陷入的陷阱 因此,对于那些感兴趣的人来说,这里是解决方案的简要概述 我有三张桌子
SELECT
[Measures].[Dim Respondent Count] On 0
FROM
[DemographicsCube]
WHERE
(
[Filter1].[Answer].&[Male],
[Filter2].[Answer].&[20-25]
)
我的查询现在最多可以通过5个问题进行过滤
虽然这是可行的,但我确信有一个更优雅的解决方案。如果有人知道那是什么,我很想听
谢谢一定要购买MDX解决方案并阅读。很好的资源,为什么会被否决?这是最简单的方法!当您只需要一个简单的分组语句时,为什么还要处理复杂的MDX编码呢?!