【问题标题】:MDX Filter expression understandingMDX过滤器表达式理解
【发布时间】:2015-07-21 12:26:12
【问题描述】:

我无法理解 FILTER 函数在 MDX 中的工作原理。

这是我的查询,它获取所有日历年中所有销售区域国家/地区的所有非空 Internet 订单计数值。

    SELECT 
    NON EMPTY 
    {
        Filter
        (
        {[Date].[Calendar].[Calendar Year].MEMBERS}
        ,
        [Measures].[Internet Order Count] > 0
        )
    } ON COLUMNS
    ,[Sales Territory].[Sales Territory].[Country].MEMBERS
ON ROWS
FROM [Adventure Works]
WHERE 
    [Measures].[Internet Order Count];

这给了我所有的订单,因为我按 0 过滤,结果如下所示

                CY 2010,CY 2011,CY 2012,CY 2013,CY 2014
France,         1      ,140    ,359    ,"1,917",67
Germany,               ,175    ,339    ,"1,909",61
United Kingdom ,1      ,175    ,405    ,"2,377",73
Canada,         1      ,170    ,169    ,"2,856",179
United States,  5      ,770    ,867    ,"7,590",335
Australia,      6      ,786    ,"1,130","4,640",156

我以 csv 格式输入结果,因为目前上传图片有限制。我是 MDX 新手,我的目标是过滤 Internet Order Count 大于 180 的结果集。

因此我现在将查询修改为这个 -

SELECT 
  NON EMPTY 
    {
      Filter
      (
        {[Date].[Calendar].[Calendar Year].MEMBERS}
       ,
        [Measures].[Internet Order Count] > 180
      )
    } ON COLUMNS
 ,[Sales Territory].[Sales Territory].[Country].MEMBERS
ON ROWS
FROM [Adventure Works]
WHERE 
  [Measures].[Internet Order Count];

这个给了我下面的输出-

                CY 2011,CY 2012,CY 2013,CY 2014
France,         140    ,359    ,"1,917",67
Germany,        175    ,339    ,"1,909",61
United Kingdom ,175    ,405    ,"2,377",73
Canada,         170    ,169    ,"2,856",179
United States,  770    ,867    ,"7,590",335
Australia,      786    ,"1,130","4,640",156

基本上 CY 2010 条目被过滤掉,而我期望没有条目/空白值 (France,CY 2011),(Germany, CY 2011),(UK, CY 2011), (Canada, CY 2011 ) 等,当然对于某些属于 CY 2014 的条目也有类似的结果。

我正在使用 AdventureWorksDW2014 立方体。我该怎么做呢?

【问题讨论】:

  • 您似乎过早地将答案标记为正确 - 该答案是否真的回答了您的问题?我会将我对您问题的解释添加到我的答案中。
  • 刚刚编辑了我的答案 - 希望对您有所帮助。

标签: sql-server ssas mdx adventureworks


【解决方案1】:

您只过滤互联网订单数超过 180 的年份,而不是国家维度。试试这个:

SELECT 
    NON EMPTY [Date].[Calendar].[Calendar Year].MEMBERS ON COLUMNS,
    [Sales Territory].[Sales Territory].[Country].MEMBERS ON ROWS
FROM (
    SELECT
        Filter (
            (
                [Date].[Calendar].[Calendar Year].MEMBERS , 
                [Sales Territory].[Sales Territory].[Country].MEMBERS
            ),
            [Measures].[Internet Order Count] > 180
        ) ON 0
    FROM [Adventure Works]
)
WHERE 
    [Measures].[Internet Order Count]

【讨论】:

  • 感谢 mxix 的回答。再追问一个问题,不使用子立方体查询是不是就不能得到这个?
  • 您对 sub select 的使用很有趣 :)
  • @SouravA 我同意 - 这是一种有趣的方法 - 完全符合要求,我想得很快。
  • 谢谢。还在学习MDX,不知道会不会因为使用了subselect对性能有影响。我发现这是了解如何过滤轴的好方法(仍在尝试从 sql 思维方式跳转到 mdx 思维方式)。如果不使用 subcube,我猜@whytheq 的答案是一个很好的方法。有我的 +1。
  • 子选择会立即减小立方体空间的大小:它应该很快。 MS 在他们的默认代码中到处使用子选择......所以他们必须做正确的事情!
【解决方案2】:

您的第一个脚本实际上就是以下内容。不需要任何过滤器,因为它是一个计数,所以

SELECT 
  NON EMPTY 
    [Date].[Calendar].[Calendar Year].MEMBERS ON 0
 ,[Sales Territory].[Sales Territory].[Country].MEMBERS ON 1
FROM [Adventure Works]
WHERE 
  [Measures].[Internet Order Count];

在我的旧版本 AdvWrks 中,结果如下:

AI其实认为你更追求以下:

WITH 
  MEMBER [Measures].[transformToNull] AS 
    IIF
    (
      [Measures].[Internet Order Count] <= 180
     ,null
     ,[Measures].[Internet Order Count]
    ) 
SELECT 
  NON EMPTY 
    {[Date].[Calendar].[Calendar Year].MEMBERS} ON COLUMNS
 ,[Sales Territory].[Sales Territory].[Country].MEMBERS ON ROWS
FROM [Adventure Works]
WHERE 
  [Measures].[transformToNull];

结果如下:

【讨论】:

  • 感谢whytheq的回复。我刚刚开始通过阅读和练习《MDX 解决方案》(Wiley Publication)一书中的代码来磨练我的 MDX 学习路径。在处理创建子多维数据集的一个示例中,作者引用了一个带有 FILTER 的内部 SELECT 和外部 SELECT 从中获取结果的示例,这就是我想要重现的内容。现在内部选择作为一个整体没有给我正确的结果,因此造成了混乱。所以我想了解为什么 FILTER 在内部查询中无法正常工作..cntd..
  • 我现在明白,要使过滤器工作,整个集合,即日期的横截面和销售区域成员都需要在场,这才是有意义的。关于你的答复,我有一个问题。性能方面,MEMBER 函数和 WHERE 子句的使用是否有效?这看起来很容易理解和实现。
  • 很好的尝试@whytheq
  • @VKarthik 您对在 WHERE 子句中使用过滤器的建议 - 自己尝试一下。取答案的子选择并将其移至 where 子句。它不起作用,因为您不允许在行或列上使用相同的层次结构。需要过滤您还想要呈现的层次结构是一个常见问题 - 子选择是一种常见方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
相关资源
最近更新 更多