初用数扰仓库,这个问题困扰了几个星期了
试过新增计算成员,新增脚本命令,都不管用,那位大侠用过MDX,支两招哈
用户有个需求,简化如下:
按处方区间查询物理表A:
年     月 医生 本月处方量   所属区间
2009   1  张三 50             0-100区间
2009   1  李四 500            100以上区间
2009   1  王五 50  0-100区间2009   2  张三 200 100以上区间
2009   2  李四 20 0-100区间
2009   2  王五 10  0-100区间2009   3  张三 80 0-100区间
2009   3  李四 200  100以上区间
2009   3  王五 200  100以上区间希望得到当前月每个区间对应的本年累计及本月数假如当前查询条件为2009年3
用户希望看到结果为(即,以3月的区间为基数,得到本年累计数据)
区间      本年累计数据   本月数 月
0-100区间       330 80      3
100以上区间  980 180     3即,如果用SQL的写法为:
;with aa 
as
(
select max(所属区间) 所属区间,医生 
from a where 月份=2
group by 医生)
select aa.所属区间,a.医生,
  ,sum(本月处方量)  本年累计数据
  ,sum(case 月份=2 then 本月处方量 else 0 end) 本月处方量
from a left join aa on a.医生=aa.医生
group by aa.所属区间,a.医生
可是,如果把区间做为维度
出现的结果是
区间      本年累计数据   本月数 月
0-100区间        210 80      3
100以上区间   1100 180     3即,如果用SQL的写法为:
select a.所属区间,a.医生,
  ,sum(本月处方量)  本年累计数据
  ,sum(case 月份=2 then 本月处方量 else 0 end) 本月处方量
from a
group by a.所属区间,a.医生
请问,如何让MDX可以写出第一种结果呢

解决方案 »

  1.   

    SQL版的数据仓库大虾小虾哩~~~~~~~~~,海老大哩,还混不混这:P重分悬赏啊,我们家有银行,哈哈~~~~~
      

  2.   

    我有想过把月份+医生 做为一个维度表,然后,把所属区间做为它的一个属性,然后,使用
    [医生].[医生].CurrentMember.Properties("所属区间"),就可以得到所属区间,但这样,是要求维度里必须有医生,而我要的是按区间汇总的
    如果把医生明细直接返回给SQL server ,在SQL里再加工,速度就很慢了有没有可能在维度里不显示维度,却显示相关属性(说胡话中,偶都觉得不可能)
      

  3.   

    近身剪弟弟啊,帮忙看看啊,出出主意啊,否则你姐家的宝宝看不到你姐姐就不可爱啦:D:D:D
      

  4.   


    璇玑图,好像很厉害,莫非你写诗也厉害????HOHO
      

  5.   

    大概理解了意图,的确很难,要从3月份得到每个医生的区间,按照医生汇总再按照对应的区间汇总...我不清楚你的医生数量有多少,按照我的推断不会很多,这样的话你可以考虑在客户端拼接mdx语句来指定对应的区间来聚合。我建立一个测试的cube,可能和你的不太一样,但大体意思你应该能看明白
    测试的mdx语句with 
    member [t Test].[医生].[0-100区间]   as sum({[t Test].[医生].[张三]})
    member [t Test].[医生].[100以上区间] as sum({[t Test].[医生].[李四],[t Test].[医生].[王五]})
    select 
    non empty
    (crossjoin(
    {[t Test].[医生].[0-100区间],[t Test].[医生].[100以上区间]},
    {[t Test].[年].children}
    ))on rows,
    {[Measures].[t Test 计数],
    [Measures].[本月处方量] } on columns
    from   [Dbtestas]
    返回结果如下:
    其中
    member [t Test].[医生].[0-100区间]   as sum({[t Test].[医生].[张三]})
    member [t Test].[医生].[100以上区间] as sum({[t Test].[医生].[李四],[t Test].[医生].[王五]})这两句需要你从客户端提前获取3月份的映射关系来生成,医生越多语句越长...
      

  6.   

    稍微调整一下语句with 
    member [Measures].[累计] as [Measures].[本月处方量]
    member [Measures].[本月] as ([Measures].[本月处方量],[t Test].[月].[3])
    member [Measures].[月数] as 3
    member [t Test].[医生].[0-100区间]   as sum({[t Test].[医生].[张三]})
    member [t Test].[医生].[100以上区间] as sum({[t Test].[医生].[李四],[t Test].[医生].[王五]})select 
    non empty

    {[t Test].[医生].[0-100区间],[t Test].[医生].[100以上区间]}
     )on rows,
    {[Measures].[累计], [Measures].[本月],[Measures].[月数]} on columns
    from   [Dbtestas]
    where [t Test].[年].[2009]/*
    累计 本月 月数
    0-100区间 330 80 3
    100以上区间 980 400 3
    */
      

  7.   

    HOHO~~~~~~~~,谢谢近身剪大虾 ,偶好好看看,谢谢谢谢!!!
      

  8.   

    看来是帮不上忙了.
    能否这样先按照你要的医院+科室+医生+业务员这些维度汇总,在sqlserver中用连接服务器和opendatasource+mdx语句来访问ssas,得到的中间结果在sql中inner join之后再聚合一次.
      

  9.   

    哈哈,海GG好,问好先,偶们家小子还不会叫妈妈呢,小学不收:Djoin 数据量太大,还是要非常感谢 近身剪DD我还是在事实表里加了本年累计数,先这样用吧,以后遇到好方案再处理