MDX Filter表达理解

时间:2015-07-20 10:30:27

标签: sql-server ssas mdx adventureworks

我无法理解FILTER功能在MDX中的工作原理。

以下是我的查询,该查询获取所有日历年中所有销售地区国家/地区的所有非空互联网订单计数值。

    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订单计数大于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

基本上,2010年的CY条目被过滤掉了,而我期望的是没有(法国,CY 2011),(德国,2011年),(英国,2011年),(加拿大,2011年)的入门/空白值等等,当然也类似于2014年CY的一些条目,结果相似。

我正在使用AdventureWorksDW2014多维数据集。我该怎么做呢?

2 个答案:

答案 0 :(得分:3)

您只会过滤Internet订单数超过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]

答案 1 :(得分:3)

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

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中,会产生以下结果:

enter image description here

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];

结果如下:

enter image description here