DAX:翻译《介绍SUMMARIZECOLUMNS》

原文:Introducing SUMMARIZECOLUMNS

FilterTable参数是一个表达式,用于定义返回数据行的基表。如果所有Expression参数的值都是Blank,那么这一行不会包含在返回值中。

建议用SUMMARIZECOLUMNS来代替SUMMARIZE函数,和ADDCOLUMNS/SUMMARIZE的组合。下面两个DAX的结果是一样的:

复制代码
Sales by Year and Color new style =
SUMMARIZECOLUMNS (
    'Date'[Calendar Year],
    'Product'[Color],
    "Sales Amount", SUMX ( Sales, Sales[Quantity] * Sales[Unit Price] )
)

Sales by Year and Color using Crossjoin =
FILTER (
    SUMMARIZE (
        CROSSJOIN (
            VALUES ( 'Date'[Calendar Year] ),
            VALUES ( 'Product'[Color] )
        ),
        'Date'[Calendar Year],
        'Product'[Color],
        "Sales Amount", SUMX ( Sales, Sales[Quantity] * Sales[Unit Price] )
    ),
    NOT ( ISBLANK ( [Sales Amount] ) )
)

Sales by Year and Color optimized =
ADDCOLUMNS (
    SUMMARIZE (
        Sales,
        'Date'[Calendar Year],
        'Product'[Color]
    ),
    "Sales Amount", CALCULATE ( SUMX ( Sales, Sales[Quantity] * Sales[Unit Price] ) )
)
复制代码

一,SUMMARIZECOLUMNS函数中的FilterTable

SUMMARIZECOLUMNS 版本没有第一个参数,用来指定用于连接操作的基表。如果存在聚合表达式,那么DAX 引擎从聚合表达式中推断出这样的基表,从而产生跟基表等效的结果。但是,如果您不包含任何聚合表达式,则会得到一个交叉连接。

1,SUMMARIZECOLUMNS函数中不存在Filter Table参数

例如,下面2个DAX表达式的结果是相同的:

复制代码
Sales by Year and Color crossjoin implicit =
SUMMARIZECOLUMNS (
    'Date'[Calendar Year],
    'Product'[Color]
)

Sales by Year and Color crossjoin explicit =
CROSSJOIN (
    VALUES ( 'Date'[Calendar Year] ),
    VALUES ( 'Product'[Color] )
)
复制代码

2,SUMMARIZECOLUMNS函数中存在Filter Table参数

下面两个DAX的查询结果是相同的,在SUMMARIZECOLUMNS函数中添加FilterTable参数,用来指定聚合的基表:

复制代码
Sales by Year and Color summarize =
SUMMARIZE (
    Sales,
    'Date'[Calendar Year],
    'Product'[Color]
)

Sales by Year and Color summarizecolumns =
SUMMARIZECOLUMNS (
    'Date'[Calendar Year],
    'Product'[Color],
    Sales
)
复制代码

二,NONVISUAL函数

NONVISUAL是一个函数,这个函数的作用就是把filter设置为不可见,也就是说,把FilterTable参数标记为只作用于GroupBy_ColumnName,而不会影响最终的Measure值。

复制代码
--  NONVISUAL marks a SUMMARIZECOLUMNS filter so that it does
--  not affect measures using ALLSELECTED as part of their calculation.
--  It can be used to obtain non-visual totals at the query level.
DEFINE MEASURE Sales[Amount ALLSELECTED] =
    CALCULATE ( [Sales Amount], ALLSELECTED ( 'Date'[Calendar Year] ) )
     
EVALUATE
SUMMARIZECOLUMNS (
    'Date'[Calendar Year],
    TREATAS ( { "CY 2008", "CY 2009" }, 'Date'[Calendar Year] ),
    "Amount", [Sales Amount],
    "Amount ALLSELECTED", [Amount ALLSELECTED]
)
 
EVALUATE
SUMMARIZECOLUMNS (
    'Date'[Calendar Year],
    NONVISUAL ( TREATAS ( { "CY 2008", "CY 2009" }, 'Date'[Calendar Year] ) ),
    "Amount", [Sales Amount],
    "Amount ALLSELECTED", [Amount ALLSELECTED]
)
复制代码

三,SUMMARIZECOLUMNS缺失Row Context,只有Filter Context

SUMMARIZE 和 SUMMARIZECOLUMNS 之间的另一个区别是,SUMMARIZE 在指定聚合的表达式中同时保持行上下文和筛选上下文处于活动状态,而 SUMMARIZECOLUMNS 仅提供筛选上下文而不提供行上下文。

复制代码
Sales by Year and Color correction summarize =
SUMMARIZE (
    Sales,
    'Date'[Calendar Year Number],
    'Product'[Color],
    "Sales Amount",
    VAR delta = 'Date'[Calendar Year Number] - 2007
    VAR correction = 1 + ( delta / 100 )
    RETURN
        correction
            * SUMX ( Sales, [Quantity] * Sales[Unit Price] )
)
复制代码

因为使用 SUMMARIZECOLUMNS 时,没有要分组的列的行上下文,所以您必须使用 VALUES 从筛选上下文中检索这样的值,假设如果您没有在汇总中评估表达式,则只有一个活动值:

复制代码
Sales by Year and Color correction summarizecolumns =
SUMMARIZECOLUMNS (
    'Date'[Calendar Year Number],
    'Product'[Color],
    "Sales Amount",
    VAR delta = VALUES ( 'Date'[Calendar Year Number] ) - 2007
    VAR correction = 1 + ( delta / 100 )
    RETURN
        correction
            * SUMX ( Sales, [Quantity] * Sales[Unit Price] )
)
复制代码

如果您在 SUMMARIZECOLUMNS 中激活了汇总,那么您必须考虑到筛选上下文中将有多个值。在这种情况下,在调用 VALUES 之前,需要使用 HASONEVALUE 检查是否存在多个值。

复制代码
Sales by Year and Color correction summarizecolumns with subtotals =
SUMMARIZECOLUMNS (
    ROLLUPADDISSUBTOTAL ( 'Date'[Calendar Year Number], "All Years" ),
    'Product'[Color],
    "Sales Amount",
    VAR delta =
        IF (
            HASONEVALUE ( 'Date'[Calendar Year Number] ),
            VALUES ( 'Date'[Calendar Year Number] ) - 2007,
            0
        )
    VAR correction = 1 + ( delta / 100 )
    RETURN
        correction
            * SUMX ( Sales, [Quantity] * Sales[Unit Price] )
)
复制代码

 

posted @   悦光阴  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
历史上的今天:
2017-02-27 数据压缩
点击右上角即可分享
微信分享提示