过滤器应该在SUMMARIZE内部还是外部使用?

时间:2018-01-21 18:03:29

标签: dax

我有这两个问题:

EVALUATE
FILTER (
    SUMMARIZE (
        'Sales',
        Products[ProductName],
        'Calendar'[CalendarYear],
        "Total Sales Amount", SUM ( Sales[SalesAmount] ),
        "Total Cost", SUM ( 'Sales'[TotalProductCost] )
    ),
    Products[ProductName] = "AWC Logo Cap"
)
ORDER BY
    Products[ProductName],
    'Calendar'[CalendarYear] ASC

和此:

EVALUATE
SUMMARIZE (
    FILTER ( 'Sales', RELATED ( Products[ProductName] ) = "AWC Logo Cap" ),
    Products[ProductName],
    'Calendar'[CalendarYear],
    "Total Sales Amount", SUM ( Sales[SalesAmount] ),
    "Total Cost", SUM ( 'Sales'[TotalProductCost] )
)
ORDER BY
    Products[ProductName],
    'Calendar'[CalendarYear] ASC

两者都返回以下内容:

enter image description here

两个查询之间的唯一区别是FILTER功能的定位 - 这是更好的做法,为什么?

请注意

因此,看看Alex引用的两篇sqlbi文章,我们可以做以下任何一项,以便使性能更高效,但我仍然不确定FILTER函数是否应该在其他语法内部或外部发生:

EVALUATE
FILTER (
    ADDCOLUMNS (
        SUMMARIZE ( 'Sales', Products[ProductName], 'Calendar'[CalendarYear] ),
        "Total Sales Amount", CALCULATE ( SUM ( Sales[SalesAmount] ) ),
        "Total Cost", CALCULATE ( SUM ( 'Sales'[TotalProductCost] ) )
    ),
    Products[ProductName] = "AWC Logo Cap"
)
ORDER BY
    Products[ProductName],
    'Calendar'[CalendarYear] ASC

使用'SUMMARIZECOLUMNS'功能:

EVALUATE
FILTER (
    SUMMARIZECOLUMNS (
        Products[ProductName],
        'Calendar'[CalendarYear],
        "Total Sales Amount", SUM ( Sales[SalesAmount] ),
        "Total Cost", SUM ( 'Sales'[TotalProductCost] )
    ),
    Products[ProductName] = "AWC Logo Cap"
)
ORDER BY
    Products[ProductName],
    'Calendar'[CalendarYear] ASC

note2

看起来SUMMARIZECOLUMNS有一个内置的FILTER参数,所以我猜这是防范性能问题的最好方法:

EVALUATE
SUMMARIZECOLUMNS (
    Products[ProductName],
    'Calendar'[CalendarYear],
    FILTER ( 'Products', Products[ProductName] = "AWC Logo Cap" ),
    "Total Sales Amount", SUM ( Sales[SalesAmount] ),
    "Total Cost", SUM ( 'Sales'[TotalProductCost] )
)
ORDER BY
    Products[ProductName],
    'Calendar'[CalendarYear] ASC

1 个答案:

答案 0 :(得分:2)

在你给出的两个选项中,我怀疑后者可能在计算上更有效率。但是,两者都不是“最佳实践”。

根据Best Practices Using SUMMARIZE and ADDCOLUMNS on sqlbi.com

  

您应该始终支持ADDCOLUMNS版本。根据经验,您不应该使用SUMMARIZE添加扩展列,除非由于以下至少一个条件而需要它:

     
      
  • 您希望在一个或多个分组列上使用ROLLUP以获取小计

  •   
  • 您在扩展列中使用了非平凡的表表达式,您将在本文后面的“在SUMMARIZE和ADDCOLUMNS中过滤上下文”部分中看到

  •   

请同时查看SUMMARIZECOLUMNS上的文章,该文章在大多数用例中推荐使用较新的功能。