Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mdx 如何通过同一层次结构中的多个项筛选filter函数中的度量值_Mdx - Fatal编程技术网

Mdx 如何通过同一层次结构中的多个项筛选filter函数中的度量值

Mdx 如何通过同一层次结构中的多个项筛选filter函数中的度量值,mdx,Mdx,我正在创建一个生成MDX查询的应用程序。我坚持实现一个场景,当用户使用该函数时,在逻辑表达式中,用户希望由同一层次结构中的多个成员对度量值进行切片 下面是一个真实的例子:有一个立方体教育,它具有以下维度和度量 维度:学生、学年 措施:学生出勤、学生违规 用户希望查看2010和2011学年有一个或多个学生违规的学生的出勤情况 我需要使用Filter函数来实现这一点,所以我在下面编写了查询 SELECT [Measures].[Student Attendance] ON COLUMNS FROM

我正在创建一个生成MDX查询的应用程序。我坚持实现一个场景,当用户使用该函数时,在逻辑表达式中,用户希望由同一层次结构中的多个成员对度量值进行切片

下面是一个真实的例子:有一个立方体教育,它具有以下维度和度量

维度:学生、学年 措施:学生出勤、学生违规 用户希望查看2010和2011学年有一个或多个学生违规的学生的出勤情况

我需要使用Filter函数来实现这一点,所以我在下面编写了查询

SELECT [Measures].[Student Attendance] ON COLUMNS
FROM (
  SELECT 
    FILTER(
        [Student].[Student].[Student].Members, 
          (
            [Measures].[Student Infractions], 
            AGGREGATE(
                {
                  [School Year].[School Year].&[2010]
                 ,[School Year].[School Year].&[2011]
                }
            )
          ) > 1
    ) ON COLUMNS
  FROM [Education]
)
问题是,当执行此查询时,它会抛出 '查询4,55元组函数要求2参数使用元组集表达式。使用了字符串或数字表达式。”

看起来不可能在Filter函数中使用该函数。有没有办法让查询正常工作?

您可以使用HAVING子句

我几乎不使用过滤功能-它速度慢且不灵活。拥有允许您根据所需的任何计算成员筛选任何集合

<>编辑:只要你需要MDX生成,你就应该考虑使用所有MDX浏览器Excel、SSM等的一般方法:

用户提供[学年].[学年].&[2010],[学年].[学年].&[2011]作为多维数据集切片,同时还需要度量值过滤器

首先,为每个[学年]生成子选择,仅选择 年份:

。。。 从

在0上选择{[学年].[学年].&[2010],[学年].[学年].&[2011]}

来自[教育]

第二,在顶部设置过滤器以获得所需的内容

问题是您应该自己构造额外的计算成员,通常使用聚合。通常,您需要默认的聚合函数。因此,对于可视化编程查询,您可能能够在100种可能的场景中选择1种


但是,当MDX浏览器足够智能,可以同时使用维度过滤器和度量值组成员过滤器生成查询时,这种情况很少发生。甚至像SSMS/Excel这样的重产品也将此任务委托给纯MDX代码

您有一个额外的方括号,如下所示,这是元组的第二个参数的一部分-这可能是错误消息的原因:

SELECT [Measures].[Student Attendance] ON COLUMNS
FROM (
  SELECT 
    FILTER(
        [Student].[Student].[Student].Members, 
          (
            [Measures].[Student Infractions], 
            AGGREGATE(
                {
                  [School Year].[School Year].&[2010]
                 ,[School Year].[School Year].&[2011]]   //<<<EXTRA BRACKET !
                }
            )
          ) > 1
    ) ON COLUMNS
  FROM [Education]
)
编辑

您可以使用原始查询,但不使用聚合,但根据AdvWrks进行了测试,似乎执行正常:

SELECT 
  [Measures].[Student Attendance] ON COLUMNS
FROM 
(
  SELECT 
      Filter
      (
        [Student].[Student].[Student].MEMBERS
       ,
          [Measures].[Student Infractions]
        * 
          ([School Year].[School Year].&[2010] + [School Year].[School Year].&[2011])
      )
    > 1 ON COLUMNS
  FROM [Education]
);
这是我编写的AdvWrks等效脚本-运行正常:

SELECT 
  [Measures].[Internet Sales Amount] ON 0
FROM 
(
  SELECT 
    Filter
    (
      [Product].[Product Categories].[Subcategory].MEMBERS
     ,
          [Measures].[Reseller Order Quantity]
        * 
          (
            [Date].[Calendar].[Calendar Year].&[2007]
          + 
            [Date].[Calendar].[Calendar Year].&[2008]
          )
      > 1
    ) ON 0
  FROM [Adventure Works]
);
编辑2

好的-我应该更彻底地阅读MSDN!这是聚合的语法:

聚合集合集合表达式[,数值集合表达式]

按照这个建议

SELECT 
  [Measures].[Student Attendance] ON COLUMNS
FROM 
(
  SELECT 
      Filter
      (
        [Student].[Student].[Student].MEMBERS
       ,
          AGGREGATE(
            {[School Year].[School Year].&[2010] , [School Year].[School Year].&[2011]}
            ,[Measures].[Student Infractions]    
      )
    > 1 ON COLUMNS
  FROM [Education]
);

那么,为什么不在2010年和2011年的多维数据集中添加一个度量值呢?增加这一点将大大降低复杂性

最终查询可以如下所示:

WITH [Measures].[Student Attendance For Selected Years] AS
AGGREGATE(
                {
                  STRTOSET('[School Year].[School Year].&[2010]
                 ,[School Year].[School Year].&[2011]') ---STRTOSET function allows for this part to be a parameter
                },
                [Measures].[Student Infractions]
         )

SELECT [Measures].[Student Attendance] ON COLUMNS
 FROM [Education]
 WHERE FILTER([Student].[Student].children, [Measures].[Student Attendance For Selected Years]>1)

您需要做的是构建参数并将其传递到MDX的stroset部分。请参阅stroset函数如何与SSRS一起使用。你可以试试类似的。

乔治,谢谢你的回复。我需要一个通用的解决方案的工具,我的工作。我不能使用Having,因为它不能用于子选择。此外,我不能使用SUM函数,因为可能存在另一种具有不同聚合类型的度量,而不是学生违规;Filter函数满足我的所有要求,除了通过来自同一层次结构的多个成员过滤度量之外,所以我希望有一种方法可以让Filter函数在我的场景中工作。您也可以在Filter中使用该成员,但决不能在Subselect中使用,遗憾的是,在这里您仅限于Filter。使用聚合而不是求和。另外,请告诉我subselect的目的-与Hetegorge相比,您不会获得太多性能,感谢您的澄清。Subselect的目的是实现一个工具,允许用户通过添加越来越多的条件和过滤器来分解数据。每个分解级别代表一个select语句,其中包含父分解级别的子select。因此,额外的括号是一个拼写错误。谢谢你指出这一点。我已经纠正了我问题中的疑问。我无法使用切片器,因为select应该在sub select中工作。子选择中不允许使用切片器。我不知道;我不认为你评论中的最后两个问题符合我的要求,因为切片器也会在20102011学年前过滤学生出勤率。无论如何,谢谢你的快速回复@Alex好的-我添加了对您原始脚本的修改。我使用了运算符+而不是函数AGGREGATE,现在看起来很开心。我不确定其中一个有效而另一个无效的原因。@Alex我还删除了我以前的一次尝试-正如您指出的,在sub select中不允许使用的位置。我已经更正了我帖子中的第二个脚本,以便它正确地使用WHERE子句返回您的数字ok。我也知道
d找出聚合的正确语法,并在我的帖子末尾添加了脚本。whytheq,感谢您的解决方案。根据您的示例,我的查询使用聚合函数。我现在唯一的问题是聚合函数不能用于计算度量值,因此我无法实现该场景的通用解决方案,但至少这对我来说是一个很好的起点。whytheq,关于您的第一次编辑,它执行正常,但在移动此部分[measures]之后,我得到了错误的数字。[学生违规]*[学年].[学年].&[2010]+[学年].[学年].&[2011]对于成员区域,我遇到了一个无限循环错误,我无法向多维数据集添加常规度量值,因为我正在实现一个生成MDX查询的工具。如果[Measures].[Student Infrasions]是一个经过计算的度量,那么您的示例将不起作用。这是聚合函数Go对计算成员的限制。WITH子句创建计算成员,我在回答中使用了它。此外,stroset允许您添加年的动态值。据我猜测,2010年和2011年是样本值,但作为最终产品,您需要动态地度过年份。with子句中定义的计算成员在子选择中不可用。所以我不能使用这种方法。这听起来并不粗鲁,但当有其他解决方案时,为什么你会执意使用子选择呢?我的解决方案不使用子选择。对你来说必须有一个是一种限制吗?
SELECT 
  [Measures].[Student Attendance] ON COLUMNS
FROM 
(
  SELECT 
      Filter
      (
        [Student].[Student].[Student].MEMBERS
       ,
          AGGREGATE(
            {[School Year].[School Year].&[2010] , [School Year].[School Year].&[2011]}
            ,[Measures].[Student Infractions]    
      )
    > 1 ON COLUMNS
  FROM [Education]
);
WITH [Measures].[Student Attendance For Selected Years] AS
AGGREGATE(
                {
                  STRTOSET('[School Year].[School Year].&[2010]
                 ,[School Year].[School Year].&[2011]') ---STRTOSET function allows for this part to be a parameter
                },
                [Measures].[Student Infractions]
         )

SELECT [Measures].[Student Attendance] ON COLUMNS
 FROM [Education]
 WHERE FILTER([Student].[Student].children, [Measures].[Student Attendance For Selected Years]>1)