没有合适的资源?快使用搜索试试~ 我知道了~
首页SSAS中Cube的结构
SSAS中Cube的结构

在SSAS(SQL Server Analysis Services)中构建Cube和编写MDX
资源详情
资源评论
资源推荐

中 的结构
在 ()中构建 和编写 的时候,我们很容易
被一些名词弄糊涂,比如:(维度),(度量维度),
(度量),(层次结构),(属性层次结构),
(级别),(单元),(成员),(成员属性),
(集),(元组)等等。要想弄清楚这些名词,就必须理解 的结构。
就象一个坐标系,每一个 代表一个坐标轴,要想得到一个点,就必须在每一个
坐标轴上取的一个值,而这个点就是 中的 。见下图
!"#"$%&''(('")):
上图很好的说明了 、、 之间的关系。这里需要注意的是:其实
也属于一个维度,即 。所有的 构成了
,这个维度的只有一个 ,而且这个 只有一个层次()。
1

、 和
在上节的图中,每个 只有一个 ,而在实际的环境中,一个
往往有很多 。因此,上一小节中关于“ 就象一个坐标系,每一个 代表一
个坐标轴”这句话其实不够准确,准确的说应该是每一个 代表了一个坐标轴,而
中每一个 代表了坐标轴上的一个值。下图以时间维度为例展示了 的内部结构。
此外,我们需要说明的是:
&*上图中说明的是一般 的结构,在实际的模型中,其实可以做很多自定义的工作。比
如:我们可以修改 的默认 。
!*一般情况下, 中 的默认 是 (在你的模型中,可能叫其他名称)。
换句话说在 中+时间,"+财政,等价于+时间,"+财政,"+,,+时间,"+财政," 等价于+时间,"
+财政,"+," 。
-*Dimension_Name.Hierarchy_Name.Level_Name 等价于
Dimension_Name.Hierarchy_Name.Level_Name.Members。比如:+时间,"+财政,"+半年,
等价于+时间,"+财政,"+半年,"。 的 是该级别的所有元素(对于+时间,"+财
政,"+半年,"./+上半年,,+下半年,,+上半年,,+下半年,0,其中前两个是 !11& 年下的,
后两个属于 !11! 年),而 的 包含了该 下所有的内容。
2

'*当且仅当一个 下只有一个 ,则 Dimension_Name 等价于
Dimension_Name.Hierarchy_Name 纬度。比方说:时间维度只有一个财务 ,则+时
间,等价+时间,"+财务,。
2* 中 的层次是两层(3 的说法更加准确,这里简化了一
些):第一层:,第二层:叶子节点。也就是说它和多层的 相比,两者结构完全相同,
这是统一维度模型(45 )一个方面的体现。
66666注意:采用 能够使编写 更加容易,但同时也增加了 的容量,
加大了 的个数,对性能有负面影响。因此,在建模的时候,我们可以把一些
的 7 属性设置成 8,同时在编写 时,以
的方式来引用,这样可以在满足需求的前提下提高性能。
9* 是一个特殊的维度,它的 中没有 这个成员,它的默认
可以在建模时指定。
:*对于一般的维度,其第一层 的默认是“()”。
和
如果说 好像一个坐标系,那么 、 的关系就好比点和面的关系。 由
中每个 的一个 组成。由于 的个数非常多,所以一般不可能在
表达式中把所有的 都明确指定,故此,为了简化开发,所有没有明确指定
的 ,用该 的默认 代替。也就是说:;+时间,"+财政,"+!11&,"+上半
年,*等价于(+时间,"+财政,"+!11&,"+上半年,,+时间,"+日历,"+,)。另外我们需要注意的:
&*有的说法认为: 是“上的一个子集(不断开的子 ),这个看法是不准确的,
因为 只是一个点,不是面,它仅仅由每个 的一个 组成的。
!*外面()起来的表达式不一定是 。比如:(+时间,"+财政,"+半年,",+时间,"
+日历,"+!11&,"+上半年,)就不是一个 ,而是一个 ,其原因在于, 是点,它仅仅
由每个 的一个 组成,如果在任何一个 上有两个成员,则其就变成
了。
66666注意:(+时间,"+财政,"+半年,",+时间,"+日历,"+!11&,"+上半年,)等价于
<(+时间,"+财政,"+半年,",+时间,"+日历,"+!11&,"+上半年,)或/+时间,"+财政,"
+半年,"0=/+时间,"+日历,"+!11&,"+上半年,0,在 的 中,我们可以在()中
定义多个用逗号分隔开的表达式,编译器会进行分析,如果发现是 的话,就把它转化成多个 相
乘的形式。
3

-*6 中的 可以重复。比如:/+时间,"+日历,"+!11&,"+上半年,,+时间,"+日历,"
+!11&,"+上半年,0并不等于/+时间,"+日历,"+!11&,"+上半年,0,因为前者有两个 ,后者只有
一个。
'* 能够根据上下文的需要,自动把 变成 ,单个 变成 ,多个
变成 。这也是我们常常混淆 和 的原因。详细的例子如下:
)上下文需要 时,(+时间,"+日历,"+!11&,"+上半年,)自动转化成/+时间,"+日历,"
+!11&,"+上半年,0。
)上下文需要 时,+时间,"+日历,"+!11&,"+上半年,自动转化成(+时间,"+日历,"
+!11&,"+上半年,)。
)上下文需要 时,+时间,"+日历,"+!11&," 自动转化成/+时间,"+日历,"
+!11&," 0。
总结
总体来看, 中的 的内部结构非常的清晰,在实际开发中,只要多注意一下默认的一些
转化,使用起来是很容易的。
如何使用 编写同比和环比
在做 >? 项目中,用户会经常提出类似下面这样的需求:
&"本月比上月的销售额增长了多少?百分比是多少?
!"本季度第一个月比上季度第一个月的销售额增长了多少?百分比是多少?
其实这两个需求就是我们常说的同比和环比问题,它们用关系数据库的 语句难于实现,而用
>? 中的 来做却轻而易举。以下例子采用的是 !112 的 中的
示例库。
环比
需求:本月比上个月的销售额增长了多少个百分点?
语句如下:
@?67>7A6"+6B6A,66
66+,"+?66,
66;+,"+?66,C+,"
+8,""*6%&
66C68DAEA?3F6.6G1HG
776
/+,"+?66,C6"+6B6A,06D361C
4

+,"+8,"+,"6D36&
8AD6+ 6@I,
结果如下:
上面的输出结果有一个问题,就是第一行数据会发生除 1 的情况,为了防止这种情况, 修改如下:
@?67>7A6"+6B6A,66
66??8;?7J;;+,"+?66,C+,"
+8,""**C6KKC6
666+,"+?66,
66;+,"+?66,C+,"
+8,""*6%&
66*C68DAEA?3F6.6G1HG
776
/+,"+?66,C6"+6B6A,06D361C
+,"+8,"+,"
6D36&
8AD6+ 6@I,
如果发现 1 为空,则显示空字符串。输出结果如下:
5
剩余25页未读,继续阅读



安全验证
文档复制为VIP权益,开通VIP直接复制

评论4