【问题标题】:Aging Report MDX query issue?老化报告 MDX 查询问题?
【发布时间】:2015-01-17 07:42:49
【问题描述】:

下面是我的MDX 查询以生成老化报告。我想使用一个名为SET 在计算量度内。我收到此错误:

Query (3, 1) 该函数需要一个元组集合表达式来表示 1 争论。使用了字符串或数字表达式。

这可以解决吗?

WITH 
  SET [Cnt] AS 
    {'FILTER(
          [Cheque Detail Fact Keys].[Cheque Master ID].[Cheque Master ID]
         ,[Measures].[Paid Amt]<>0
       )'
    } 
  SET [x] AS 
    {
      ClosingPeriod
      (
        [Cal Date].[Month].[Month]
       ,[Cal Date].[Month].[All]
      )
    } 
  MEMBER [Measures].[0-30] AS 
    Sum
    (
      [x].Item(0).Lag(1) : [x].Item(0).Lag(0)
     ,Count(Cnt) //[Measures].[Master Count] 
    ) 
  MEMBER [Measures].[31-60] AS 
    Sum
    (
      [x].Item(0).Lag(2) : [x].Item(0).Lag(1)
     ,Count(Cnt) //[Measures].[Master Count] 
    ) 
  MEMBER [Measures].[>60] AS 
    Sum
    (
      NULL : [x].Item(0).Lag(4)
     ,Count(Cnt)  //[Measures].[Master Count] 
    ) 
SELECT 
  {
    [Measures].[0-30]
   ,[Measures].[31-60]
   ,[Measures].[>60]
  } ON 0
 ,{[Customer].[Name].[Name].ALLMEMBERS} ON 1
FROM [My Cube];

【问题讨论】:

  • 如果我的代码有效,请告诉我。

标签: sql sql-server reporting-services ssas mdx


【解决方案1】:

我认为这只是脚本的第一部分。你为什么使用字符串?尝试删除撇号并添加 .MEMBERS 以清楚起见:

WITH 
  SET [Cnt] AS 
    {FILTER(
          [Cheque Detail Fact Keys].[Cheque Master ID].[Cheque Master ID].MEMBERS
         ,[Measures].[Paid Amt]<>0
       )
    } 
   ...
   ...

错误信息似乎有点神秘,但我相信花括号本身就是一个函数——它们将其中的任何成员转换为一个集合。所以你已经有效地写了这个{&lt;some string&gt;},但是花括号期待的东西可以是一个集合。

我在运行以下 AdvWrks 脚本时收到相同的错误消息:

WITH 
  SET [Cnt] AS 
    {'FILTER(
          [Date].[Date].[Date].MEMBERS
         ,[Measures].[Internet Sales Amount] > 10000
       )'
    } 
SELECT 
  [Measures].[Internet Sales Amount] ON 0
 ,[Cnt] ON 1
FROM [Adventure Works];

要在以下度量中使用 Cnt 计数,您可以创建一个度量,但我认为这不会是上下文感知的,因为该集合是在其他任何事情之前评估的:

WITH 
  SET [Cnt] AS 
    {FILTER(
          [Cheque Detail Fact Keys].[Cheque Master ID].[Cheque Master ID]
         ,[Measures].[Paid Amt]<>0
       )
    } 
  MEMBER [Measures].[Master Count]  AS 
    [Cnt].count
  SET [x] AS 
    {
      ClosingPeriod
      (
        [Cal Date].[Month].[Month]
       ,[Cal Date].[Month].[All]
      )
    } 
  MEMBER [Measures].[0-30] AS 
    Sum
    (
      [x].Item(0).Lag(1) : [x].Item(0).Lag(0)
     ,[Measures].[Master Count] 
    ) 
  MEMBER [Measures].[31-60] AS 
    Sum
    (
      [x].Item(0).Lag(2) : [x].Item(0).Lag(1)
     ,[Measures].[Master Count] 
    ) 
  MEMBER [Measures].[>60] AS 
    Sum
    (
      NULL : [x].Item(0).Lag(4)
     ,[Measures].[Master Count] 
    ) 
SELECT 
  {
    [Measures].[0-30]
   ,[Measures].[31-60]
   ,[Measures].[>60]
  } ON 0
 ,{[Customer].[Name].[Name].ALLMEMBERS} ON 1
FROM [My Cube];

【讨论】:

  • 参考计算的度量值 >60 天。超过 60 天需要使用 Count (Cnt) (SET) 而不是 SUM。如何使用计数度量?
  • 你能创建一个AdvWks 的例子让我玩吗?
【解决方案2】:

问题是您试图将字符串传递给集合。您需要先使用StrToSet 函数将字符串转换为集合。正如@whytheq 所说,您不需要花括号。

尝试替换

WITH 
  SET [Cnt] AS 
    {'FILTER(
          [Cheque Detail Fact Keys].[Cheque Master ID].[Cheque Master ID]
         ,[Measures].[Paid Amt]<>0
       )'
    } 

有了这个-->

WITH 
  SET [Cnt] AS 
    StrToSet('FILTER(
          [Cheque Detail Fact Keys].[Cheque Master ID].[Cheque Master ID]
         ,[Measures].[Paid Amt]<>0
       )'
     )

同样使用COUNT函数的正确方法是&lt;&lt;SomeSet&gt;&gt;.COUNTNOT COUNT(&lt;&lt;SomeSet&gt;&gt;)

【讨论】:

    【解决方案3】:

    [Cnt] 集看起来很昂贵……这是基于事实表的吗?如果有,粒度是多少?

    也许您可以在 DSV 中为度量值组的基表添加一个计算字段(例如 IIF(Paid Amt 0, 1, 0) ),然后在该字段上创建一个基于 SUM 的度量值。那么你的查询就变成了……

    WITH  
      SET [x] AS 
        {
          ClosingPeriod
          (
            [Cal Date].[Month].[Month]
           ,[Cal Date].[Month].[All]
          )
        } 
      MEMBER [Measures].[0-30] AS 
        Sum
        (
          [x].Item(0).Lag(1) : [x].Item(0).Lag(0)
         ,[Measures].[NonZero Check Count] 
        ) 
      MEMBER [Measures].[31-60] AS 
        Sum
        (
          [x].Item(0).Lag(2) : [x].Item(0).Lag(1)
         ,[Measures].[NonZero Check Count] 
        ) 
      MEMBER [Measures].[>60] AS 
        Sum
        (
          NULL : [x].Item(0).Lag(4)
         ,[Measures].[NonZero Check Count] 
        ) 
    SELECT 
      {
        [Measures].[0-30]
       ,[Measures].[31-60]
       ,[Measures].[>60]
      } ON 0
     ,{[Customer].[Name].[Name].ALLMEMBERS} ON 1
    FROM [My Cube];
    

    【讨论】:

    • SET(Cnt) 基于维度表
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    相关资源
    最近更新 更多