应该在SUMMARIZE的内部还是外部使用FILTER?

why*_*heq 5 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
Run Code Online (Sandbox Code Playgroud)

和这个:

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
Run Code Online (Sandbox Code Playgroud)

两者都返回以下内容:

在此处输入图片说明

这两个查询之间的唯一区别是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
Run Code Online (Sandbox Code Playgroud)

并使用“ 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
Run Code Online (Sandbox Code Playgroud)

笔记2

看起来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
Run Code Online (Sandbox Code Playgroud)

Ale*_*son 5

在您提供的两个选项中,我怀疑后者在计算上可能会更有效。但是,这都不是“最佳实践”。

根据sqlbi.com上使用SUMMARIZE和ADDCOLUMNS的最佳实践

您应该始终偏爱ADDCOLUMNS版本。经验法则是,除非由于以下至少一种情况而需要使用SUMMARIZE,否则决不要使用SUMMARIZE添加扩展列:

  • 您想对一个或多个分组列使用ROLLUP以获得小计

  • 您将在扩展列中使用非平凡的表表达式,如本文后面的“ SUMMARIZE和ADDCOLUMNS中的筛选器上下文”部分中所见

请同时查看其有关SUMMARIZECOLUMNS的文章,该文章在大多数使用情况下都建议使用较新的功能。