请教:一个简单的MDX查询问题(关于成员属性的使用)

liuri璇玑 2009-09-21 02:04:41
我希望显示出机构BG00000118的各业务员(包括业务员编写与名称)的月销售量Month_Quantity
[salesman].[Personnel]是一个维度,有键Personnel,属性Personnel_name

现在,如果只显示编码没问题,即:
select {[Measures].[Month_Quantity]} on 0
,non empty {[salesman].[Personnel].[Personnel]} on 1
from [渠道分析]
where ([office].[organ].&[BG00000118])
只返回5条记录,即我这个机构按业务员汇总的销量


WITH MEMBER own_cust AS
[salesman].[Personnel].CurrentMember.Properties("Personnel_name")

select {own_cust,[Measures].[Month_Quantity]} on 0
,non empty {[salesman].[Personnel].[Personnel]} on 1
from [渠道分析]
where ([office].[organ].&[BG00000118])
会返回2000多条,即所有业务员的销量,where ([office].[organ].&[BG00000118])就象没起作用式的

请问应该如何处理?
...全文
192 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuri璇玑 2009-09-22
  • 打赏
  • 举报
回复
谢谢!
bendanlzh 2009-09-21
  • 打赏
  • 举报
回复
http://blog.csdn.net/bendanlzh/archive/2009/06/27/4302215.aspx
之前做二次开发的一点关于成员属性的总结,只是我个人观点!
bendanlzh 2009-09-21
  • 打赏
  • 举报
回复
问题有点复杂,我说说我的观点啊。
([salesman].[Personnel].[Personnel],[salesman].[Personnel_name].[Personnel_name])和
[salesman].[Personnel].[Personnel]*[salesman].[Personnel_name].[Personnel_name] 其实都是对这两个集合做笛卡尔积,得到一个成员集合,效果是一样的,效率上没什么实质的差别,Crossjion能少用的尽量少用,或者是Crossjion前将参与的集合成员最小化。
[salesman].[Personnel].CurrentMember.Properties("Personnel_Name")
成员属性有一个好处就是在维度中可以不用建成层次结构级关系而使用它,也就是它在cube处理时,不计算它和别的维度的聚合(减少cube大小),但同时又能保持它和键属性间的关系。它的用处很多,如客户端展示工具的tip,条件过滤……等等。
liuri璇玑 2009-09-21
  • 打赏
  • 举报
回复
对的,把non empty去掉,
select {[Measures].[Month_Quantity]} on 0
,{[salesman].[Personnel].[Personnel]} on 1
from [渠道分析]
where ([office].[organ].&[BG00000118])
显示结果就是2000多条,和加了own_cust一样

偶明白了,因为own_cust导致0轴结果集不为空,所以就显示了这么多

刚刚还发现,其实好象写法上没有我想像的复杂,不用WITH显示属性,直接
select {[Measures].[Month_Pres_Quantity]} on 0
,non empty {
([salesman].[Personnel].[Personnel],[salesman].[Personnel_name].[Personnel_name])} on 1
from [渠道分析]
where ([office].[organ].&[BG00000118])

发现用[salesman].[Personnel].[Personnel],[salesman].[Personnel_name].[Personnel_name]

[salesman].[Personnel].[Personnel]*[salesman].[Personnel_name].[Personnel_name]

都可以实现,是否是用,这种方式效率最高呢?

那么,[salesman].[Personnel].CurrentMember.Properties("Personnel_Name")
这种情况又是一般在什么时候需要用到呢,在属性必须显示在事实数据中时?

bendanlzh 2009-09-21
  • 打赏
  • 举报
回复
我理解是这样的,在你这里[office].[organ].&[BG00000118]和[salesman].[Personnel]是两个维度没有关系,
第一个查询之所以查询来是5跳记录是以为你的其它的成员的[Measures].[Month_Quantity]的事实数据为空,被non empty去掉了
第二个查询,因为查询中多了own_cust它的事实数据不为空了,所以non empty过滤不掉了,所以就是所有的成员了。
当然这是我的猜想。还得等你查了上面说得语句后才知道
bendanlzh 2009-09-21
  • 打赏
  • 举报
回复
select {[Measures].[Month_Quantity]} on 0
,non empty {[salesman].[Personnel].[Personnel]} on 1
from [渠道分析]
where ([office].[organ].&[BG00000118])
你把这里的non empty去掉看一下能查询多少个?
liuri璇玑 2009-09-21
  • 打赏
  • 举报
回复
我发现这样写就可以了
WITH
MEMBER own_cust AS
[salesman].[Personnel].CurrentMember.Properties("Personnel_Name")

select {own_cust,[Measures].[Month_Quantity]} on 0
, non empty {FILTER([salesman].[Personnel].[Personnel],[office].[organ].&[BG00000118])} on 1
from [渠道分析]

可我理解散不了,这个写在where 里,和写在FILTER里的区别是什么
而且,这个时候我如果还要加条件,写在where里也是有效果的了

7,388

社区成员

发帖
与我相关
我的任务
社区描述
其他数据库开发 数据仓库
社区管理员
  • 数据仓库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧