繁体   English   中英

如何为计算所得成员建立动态MDX公式?

[英]How to build a dynamic MDX formula for a calculated member?

我正在尝试创建一个计算所得的成员以得出上周的总和。 取得星期值没有问题(我需要为两位数,即'05',所以加100-1)

with
Member [Measures].Week as 
  'right(str(int(99+datepart ( ''ww'', Now()))),2)' 

-效果正常

member [Measures].SalesUpToWeek as
  'strtomember(
     "aggregate(periodstodate([Dim].[2015],[Dim].[2015].[" + ([Measures].Week) + "]),[Measures].[Sales])")'

我得到了字面价值

aggregate(
    periodstodate([Dim].[2015],[Dim].[2015].[25])
   ,[Measures].[Sales]
)

我需要的是此MDX计算的值。

所有其他尝试均以语法错误结束。 举个例子

member [Measures].SumToWeek as 
 'aggregate(
     periodstodate(
       [Dim].[2015],[Dim].[2015].[' + strtomember([Measures].Week) + '])
   ,[Measures].[Sales])'   

错误

第2行第0列出现词法错误。遇到:之后:“ [\\ n”

任何想法?

这是您的错误:

strtomember([Measures].Week)

假设[Measures].Week等于15,则您尝试这样做:

strtomember(15)

因此,上面有两个错误:

  1. 您正在将数字输入到将字符串转换为Memebers的函数中
  2. 您需要输入成员的完整字符串表示形式,即“ [Dim]。[2015]。[15]”

也许尝试将strToMember函数放在表示成员的字符串周围:

MEMBER[Measures].SumToWeek AS
 'aggregate(
     periodstodate(
       [Dim].[2015],
       strtomember('[Dim].[2015].[' + [Measures].Week + ']', constrained)
     )
   ,[Measures].[Sales])'

这是功能strtomember的MSDN参考:
https://msdn.microsoft.com/en-us/library/ms146022.aspx?f=255&MSPPError=-2147217396


编辑

看上一篇文章:( StrToMember不接受计算量度(mdx)
...您需要先创建成员,然后再将其输入新度量,因此:

WITH 
  MEMBER [Measures].[Week] AS 
    Right
    (
      Str(Int(99 + Datepart('ww',Now())))
     ,2
    ) 
  MEMBER [Dim].[2015].[TargetWeek] AS 
    StrToMember
    (
      '[Dim].[2015].[' + [Measures].Week + ']'
     ,constrained
    ) 
  MEMBER [Measures].SumToWeek AS 
    Aggregate
    (
      PeriodsToDate
      (
        [Dim].[2015]
       ,[Dim].[2015].[TargetWeek]
      )
     ,[Measures].[Sales]
    ) 

EDIT2

好吧,如果您希望使用PeriodsToDate那么我们需要使用StrToSet ,然后在函数内使用此set中的成员。 这是因为自定义成员失去了家庭联系,因此在某些mdx函数中无用。 这是AdvWrks工作脚本,阐明了我建议的方法:

WITH 
  MEMBER [Measures].[Wk] AS 
    Right
    (
      Str(Int(99 + Datepart('ww',Now())))
     ,2
    ) 
  SET [TargetWeek] AS 
    StrToSet
    (
     '[Date].[Calendar Weeks].[Calendar Week].[Week ' + cstr([Measures].[Wk]) + ' CY 2007]'

    ) 
  MEMBER [Measures].[SumToWeek] AS 
    Aggregate
    (
      PeriodsToDate
      (
        [Date].[Calendar Weeks].[Calendar Year]
       ,[TargetWeek].item(0).item(0)
      )
     ,([Measures].[Internet Sales Amount])
    ) 
SELECT 
  {[Measures].[SumToWeek]} ON 0,
  [Product].[Product Categories].[All] ON 1  
FROM [Adventure Works];

[Measures].Week已经是一个字符串实体。 您无需在其周围放置StrToMember 相反,您应该将其放在动态定义的字符串之外。

with
Member [Measures].Week as 
  "right(str(int(99+datepart ( ''ww'', Now()))),2)"

member [Measures].SumToWeek as 
aggregate(
            periodstodate(
                        [Dim].[2015],
                        StrToMember("[Dim].[2015].[" + [Measures].Week + "]")
                         )
            ,
            [Measures].[Sales]
         )

在Pentaho论坛上,我得到了一个有趣的建议,使我指向了一个不错的博客文章,该博客文章允许编写一个优雅的解决方案:

http://diethardsteiner.blogspot.com.es/2009/10/current-date-function-on-mondrian.html

with
member [Measures].sm as aggregate(
    periodstodate(
        currentdatemember([Dim],'["Dim"]\.[yyyy]'),                     -- current year
        currentdatemember([Dim],'["Dim"]\.[yyyy]\.[ww]').lag(1)   -- previous week
    ),
    [Measures].[Sales])

THKS

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM