【问题标题】:Adding a filter on MDX query在 MDX 查询上添加过滤器
【发布时间】:2015-02-02 17:41:57
【问题描述】:
SELECT  
  {[Measures].[Imports - Tons]
   , [Measures].[Imports - Metric Tonnes]
   , [Measures].[Import Customs Value]  } ON COLUMNS,  
{CROSSJOIN (
   [Date].[Month Year].members
  ,[Country].[Country Name].members
  ,[Steel Mill Product].[Steel Mill Product Name].[Plates-Cut Length]
  ,[Concordance].[HTS 10 Digit Code].members) }
ON ROWS  
FROM [AISISteel]   
WHERE ([Date].[Year].[2014], [Concordance].[HTS 2 Digit Code].[72])

我有这个 MDX 查询。
我想取回所有这些数据,但只取回 Import-Tons>0 的数据。我该怎么做?

【问题讨论】:

    标签: sql mdx olap


    【解决方案1】:

    您可以尝试使用FILTER函数:

    SELECT  
      {[Measures].[Imports - Tons]
       , [Measures].[Imports - Metric Tonnes]
       , [Measures].[Import Customs Value]  } ON COLUMNS,  
    FILTER(
      {CROSSJOIN (
         [Date].[Month Year].members
        ,[Country].[Country Name].members
        ,[Steel Mill Product].[Steel Mill Product Name].[Plates-Cut Length]
        ,[Concordance].[HTS 10 Digit Code].members) }
      , [Measures].[Imports - Tons] > 0
      )
    ON ROWS  
    FROM [AISISteel]   
    WHERE ([Date].[Year].[2014], [Concordance].[HTS 2 Digit Code].[72])
    

    另外,很少使用的HAVING 子句对您来说也是一个可能的选择

    SELECT  
      {[Measures].[Imports - Tons]
       , [Measures].[Imports - Metric Tonnes]
       , [Measures].[Import Customs Value]  } 
    ON COLUMNS,  
      {CROSSJOIN (
         [Date].[Month Year].members
        ,[Country].[Country Name].members
        ,[Steel Mill Product].[Steel Mill Product Name].[Plates-Cut Length]
        ,[Concordance].[HTS 10 Digit Code].members) }
    HAVING [Measures].[Imports - Tons] > 0
    ON ROWS  
    FROM [AISISteel]   
    WHERE ([Date].[Year].[2014], [Concordance].[HTS 2 Digit Code].[72])
    

    为了简洁起见,CROSSJOIN 函数有一个快捷方式,几乎总是首选:

    SELECT  
      {[Measures].[Imports - Tons]
       , [Measures].[Imports - Metric Tonnes]
       , [Measures].[Import Customs Value]  } 
    ON COLUMNS,  
        {[Date].[Month Year].members*
         [Country].[Country Name].members*
         [Steel Mill Product].[Steel Mill Product Name].[Plates-Cut Length]*
         [Concordance].[HTS 10 Digit Code].members}
    HAVING [Measures].[Imports - Tons] > 0
    ON ROWS  
    FROM [AISISteel]   
    WHERE ([Date].[Year].[2014], [Concordance].[HTS 2 Digit Code].[72])
    

    编辑

    如果您将以上与以下进行比较,执行时间是否有很大不同?

    SELECT  
      {[Measures].[Imports - Tons]
       , [Measures].[Imports - Metric Tonnes]
       , [Measures].[Import Customs Value]  } ON COLUMNS,  
      FILTER(
        NONEMPTY(
         [Date].[Month Year].members*
         [Country].[Country Name].members*
         [Steel Mill Product].[Steel Mill Product Name].[Plates-Cut Length]*
         [Concordance].[HTS 10 Digit Code].members
        ,[Measures].[Imports - Tons]
        )
      ,[Measures].[Imports - Tons] > 0
      )
    ON ROWS  
    FROM [AISISteel]   
    WHERE ([Date].[Year].[2014], [Concordance].[HTS 2 Digit Code].[72])
    

    【讨论】:

    • 在这个例子中,HAVING 会有更好的性能
    • @DanielHanczyc 请你解释一下这条评论。我知道过滤器在性能方面通常不是很好,但除此之外,我对调整 mdx 的知识是有限的。
    • 在执行交叉连接操作后应用过滤器(未由编译器优化),而在交叉连接过程中应用'have'子句。
    • @George 谢谢 - 我认为,无论哪种方式,这个用户真正受益的是NON EMPTY,它将在filter/having之前应用
    • @whytheq,我完全同意 NON EMPTY,应该有很大帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多