在 MDX 查询上添加过滤器

Posted

技术标签:

【中文标题】在 MDX 查询上添加过滤器【英文标题】:Adding a filter on MDX query 【发布时间】: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 的数据。我该怎么做?

【问题讨论】:

【参考方案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,应该有很大帮助

以上是关于在 MDX 查询上添加过滤器的主要内容,如果未能解决你的问题,请参考以下文章

mondrian mdx 过滤日期维度中年份级别的集合

如何构建仅考虑 2 月最后 10 天发生的事实的 MDX 查询?

MDX中设置的父母

如何在 MDX 中对同一维度进行分组和过滤

Mdx,大于 String 而不是 Numeric (Saiku) 之类的作品

Excel数据透视表MDX慢?