鸟食轩

 Microsoft .NET[C#] MVP 2003
随笔 - 424, 文章 - 231, 评论 - 5410, 引用 - 344
数据加载中……

NonEmpty和Hierarchize嵌套的bug

    昨天生病了,在家休息了一天。结果今天一来就发现Tester给我准备了三个Very High的bug作为安慰!研究了半天最后发现三个bug都不是我的模块,这其中还有一个是Aanlysis Services 2005的bug。虽然这个bug搞得我相当郁闷,但是这个AS 2005 bug的现象还挺有意思。

    为了方便,就用Adventure Works作为示例(别的也还没有去试)。构建如下MDX语句:
With 
Member [DATE].[CALENDAR].[cm0] As '0'

Member 
[DATE].[CALENDAR].[cm1] As '1'
Member 
[DATE].[CALENDAR].[cm2] As '2'
Member [DATE].[CALENDAR].[cm3] As '3'
Member 
[DATE].[CALENDAR].[cm4] As '4'
Select {[Measures].[Customer Count]On Columns , 
Non Empty HIERARCHIZE({
[DATE].[CALENDAR].[CALENDAR YEAR].&[2001]
,
[DATE].[CALENDAR].[CALENDAR YEAR].&[2002]
,
[DATE].[CALENDAR].[cm0]
,
[DATE].[CALENDAR].[cm1]

}) 
On Rows 
From [ADVENTURE WORKS]
    这个MDX非常简单,但是还是有几个地方要注意。上面的Calculated Member没有用完,是为了测试用的,不用管。注意[DATE].[CALENDAR].[CALENDAR YEAR]这个Member,他本身有4个子Members。也就是*.&[2001]、*.&[2002]、*.&[2003]和*.&[2004]。所以上面这个查询的结果最多应该是4行数据,这个太明白不过了。

    但是Analysis Services 2005执行的结果却是让人大跌眼镜:   
  
Customer Count
CY 2001 1,013
CY 2002 2,677
CY 2003 9,309
CY 2004 11,377
cm1 1
cm0 0

   上面那个简单的MDX满足的条件是:CALENDAR YEAR这个成员的子成员有n个,正好上面的MDX中在Rows上方的就是n个成员(虽然是两个普通成员和两个计算成员,怎么组合没有关系,只要是Calendar Year的子成员个数那么多个就行);Non Empty(2005种可以是NonEmpty函数格式)和Hierarchize联合使用;使用特定Measures Group中的Measures(目前有问题的Measure Group是:Internet Customers、Internet Orders、Internet Sales、Reseller Orders、Reseller Sales、Sales Orders和Sales Summary)。

    暂时还没有在Analysis Services 2000中复现这个bug。如果2000中没有这个bug,那可能就是2005为了把Non Empty关键字改为NonEmpt()函数而弄出来的bug了。

posted on 2006-11-15 18:49 birdshome 阅读(2480) 评论(6)  编辑 收藏 所属分类: 商务智能(BI)开发

评论

#1楼    回复  引用    

这样的结果是对的
With
Member [DATE].[CALENDAR].[cm0] As '0'
Member [DATE].[CALENDAR].[cm1] As '1'
Member [DATE].[CALENDAR].[cm2] As '2'
Member [DATE].[CALENDAR].[cm3] As '3'
Member [DATE].[CALENDAR].[cm4] As '4'
Select
{[Measures].[Customer Count]} On Columns ,
Non Empty HIERARCHIZE({
[DATE].[CALENDAR].[CALENDAR YEAR].&[2001],
[DATE].[CALENDAR].[CALENDAR YEAR].&[2002],
[DATE].[CALENDAR].[cm0],
[DATE].[CALENDAR].[cm1]
}, POST) On Rows
From [ADVENTURE WORKS]
2006-11-16 09:40 | June [未注册用户]

#2楼 [楼主]   回复  引用  查看    

@June
给Hierarchize函数加上POST参数后,查询结果中的成员个数对了,不过又有另外一个问题。这个POST参数的效果在现在这个语句中,好像没有生效的说:
Select {[Measures].[Customer Count]On Columns , 
HIERARCHIZE({ 
[DATE].[CALENDAR].[CALENDAR YEAR].&[2004]
[DATE].[CALENDAR].[CALENDAR YEAR].&[2003]
[DATE].[CALENDAR].[CALENDAR YEAR].&[2002]
[DATE].[CALENDAR].[CALENDAR YEAR].&[2001] 
}, POST) 
On Rows From [ADVENTURE WORKS] 

查询结果为: 
             Customer Count
CY 2001 1,013
CY 2002 2,677
CY 2003 9,309
CY 2004 11,377

而根据对POST的描述:If POST is specified, the Hierarchize function sorts the members in a level using a post-natural order. 上面那个查询的结果似乎应该是: 
             Customer Count
CY 2004 11,377
CY 2003 9,309
CY 2002 2,677
CY 2001 1,013
2006-11-16 12:54 | birdshome      

#3楼    回复  引用    

看来不加post参数的时候确实是个bug啊,reference says:
"If POST is not specified, the function sorts members in a level in their natural order. Their natural order is the default ordering of the members along the hierarchy when no other sort conditions are specified. Child members immediately follow their parent members.
"
既然natural order的时候child members follow他们的parent, post-natural order应该是相反呢?即parent follow child.
至于2001与2004谁在前谁在后,如果要描述其先后顺序,其意思我觉得至少得用ascending/descending之类的词来指定参数吧;而post-的意思是“后-”,从查询的效果来看应该是指定parent vs child的顺序。
e.g.
Select {[Measures].[Customer Count]} On Columns ,
HIERARCHIZE({
[DATE].[CALENDAR].[CALENDAR YEAR].&[2004],
[DATE].[CALENDAR].[CALENDAR YEAR].&[2003],
[DATE].[CALENDAR].[CALENDAR YEAR].&[2002],
[DATE].[CALENDAR].[CALENDAR YEAR].&[2001],
[Date].[Calendar].[Calendar Semester].&[2001]&[2],
[Date].[Calendar].[Calendar Semester].&[2002]&[1],
[Date].[Calendar].[Calendar Semester].&[2002]&[2],
[Date].[Calendar].[Calendar Semester].&[2003]&[1],
[Date].[Calendar].[Calendar Semester].&[2003]&[2],
[Date].[Calendar].[Calendar Quarter].&[2003]&[2],
[Date].[Calendar].[Calendar Quarter].&[2004]&[3].
[Date].[Calendar].[Date].&[16]
},POST) On Rows From [ADVENTURE WORKS]

H2 CY 2001 1,013
CY 2001 1,013
H1 CY 2002 1,193
H2 CY 2002 1,484
CY 2002 2,677
Q2 CY 2003 950
H1 CY 2003 1,738
H2 CY 2003 8,178
CY 2003 9,309
CY 2004 11,377

去调post之后的结果为
CY 2001 1,013
H2 CY 2001 1,013
CY 2002 2,677
H1 CY 2002 1,193
H2 CY 2002 1,484
CY 2003 9,309
H1 CY 2003 1,738
Q2 CY 2003 950
H2 CY 2003 8,178
CY 2004 11,377
2006-11-16 16:00 | June [未注册用户]

#4楼 [楼主]   回复  引用  查看    

@June
天天都在网上post来post去,俺把post想成提交前的顺序了。其实这个hierarchize还属还真该提供一个这样的功能,就可以解决memebers排序的问题了。
我希望hierarchize可以提供只按层次放置成员,而在同一层内部不进行按natural order排序的功能,而是按entered order顺序输出,就很完美了:)
2006-11-16 18:20 | birdshome      

#5楼    回复  引用  查看    

好文章!
2006-12-21 15:07 | microsheen      

#6楼    回复  引用  查看    

@birdshome
另外,要实现您的要求可以这样做:
WITH
SET [Calendar Year] AS
{
[DATE].[CALENDAR].[CALENDAR YEAR].&[2004],
[DATE].[CALENDAR].[CALENDAR YEAR].&[2003],
[DATE].[CALENDAR].[CALENDAR YEAR].&[2002],
[DATE].[CALENDAR].[CALENDAR YEAR].&[2001]
}
SET [Calendar Semester] AS
{
[Date].[Calendar].[Calendar Semester].&[2001]&[2],
[Date].[Calendar].[Calendar Semester].&[2002]&[2],
[Date].[Calendar].[Calendar Semester].&[2002]&[1],
[Date].[Calendar].[Calendar Semester].&[2003]&[1],
[Date].[Calendar].[Calendar Semester].&[2003]&[2]
}
Select {[Measures].[Customer Count]} On Columns ,
GENERATE(
[Calendar Year],
{
[DATE].[CALENDAR].CurrentMember,
Exists([Calendar Semester], [DATE].[CALENDAR].CurrentMember)
}
) On Rows
From [ADVENTURE WORKS]
2006-12-21 16:41 | microsheen      

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  博客园首页

  新闻频道

  社区

  小组

  博问

  网摘

  闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-11-16 13:07 编辑过


相关链接:

历史上的今天:
2005-11-15 qqqqqqqqqqqqqqqqq