PowerBI使用ISINSCOPE实现自定义总计

我们有一张销售表,我们想统计每个月每个门店的销售员的平均销售金额

1.创建日期维度表和门店维度表

复制代码
日期表 = DISTINCT(
    SELECTCOLUMNS(
        '销量表',
        "日期",
        '销量表'[销售日期]
    )
)
门店表 = DISTINCT(
    SELECTCOLUMNS(
        '销量表',
        "门店",
        '销量表'[门店]
    )
)

2.创建度量值,计算每月每门店销售额

复制代码
每月每门店平均销售 = 
VAR Total_Sales = CALCULATE(SUM('销量表'[销售金额(元)]), FILTER(
                '销量表',
                '销量表'[销售日期] = SELECTEDVALUE('日期表'[日期]) &&
                '销量表'[门店] = SELECTEDVALUE('门店表'[门店])

))
VAR Count_Person = CALCULATE(SELECTEDVALUE('销量表'[店员数]),FILTER(
                '销量表',
                '销量表'[销售日期] = SELECTEDVALUE('日期表'[日期]) &&
                '销量表'[门店] = SELECTEDVALUE('门店表'[门店])

))
RETURN 
    DIVIDE(Total_Sales,Count_Person,0)
  1. 拖入矩阵

  1. 如图,矩阵无法自动计算总计,因为我们是用的度量值计算的平均值。解决方法:使用ISINSCOPE()来手动计算
  1. 创建度量值,计算某一个门店,所有日期的平均销售,用于总计行展示

    门店所有月平均销售 =
    VAR Total_Sales = CALCULATE(SUM('销量表'[销售金额(元)]), FILTER(
    '销量表',
    '销量表'[销售日期] IN ALLSELECTED('日期表'[日期]) //获取所有日期行
    &&
    '销量表'[门店] = SELECTEDVALUE('门店表'[门店])

    ))
    VAR Count_Person = CALCULATE(SUM('销量表'[店员数]),FILTER(
    '销量表',
    '销量表'[销售日期] IN ALLSELECTED('日期表'[日期]) //获取所有日期行
    &&
    '销量表'[门店] = SELECTEDVALUE('门店表'[门店])

    ))
    RETURN
    DIVIDE(Total_Sales,Count_Person,0)

修改之前的 每月每门店平均销售的RETURN部分,需要分情况显示不同的计算值

复制代码
每月每门店平均销售 = 
VAR Total_Sales = CALCULATE(SUM('销量表'[销售金额(元)]), FILTER(
                '销量表',
                '销量表'[销售日期] = SELECTEDVALUE('日期表'[日期]) &&
                '销量表'[门店] = SELECTEDVALUE('门店表'[门店])

))
VAR Count_Person = CALCULATE(SELECTEDVALUE('销量表'[店员数]),FILTER(
                '销量表',
                '销量表'[销售日期] = SELECTEDVALUE('日期表'[日期]) &&
                '销量表'[门店] = SELECTEDVALUE('门店表'[门店])

))
RETURN 
    IF(
        ISINSCOPE('日期表'[日期]), //判断是否在行数据块里
            DIVIDE(Total_Sales,Count_Person,0), //是,计算每月每门店
            [门店所有月平均销售] //不是,总计行
    )

效果:

  1. 创建度量值,计算每月所有门店平均销售,用于总计列

    每月所有门店平均销售 =
    VAR Total_Sales = CALCULATE(SUM('销量表'[销售金额(元)]), FILTER(
    '销量表',
    '销量表'[销售日期] = SELECTEDVALUE('日期表'[日期]) &&
    '销量表'[门店] IN ALLSELECTED('门店表'[门店]) //获取所有门店

    ))
    VAR Count_Person = CALCULATE(SUM('销量表'[店员数]),FILTER(
    '销量表',
    '销量表'[销售日期] = SELECTEDVALUE('日期表'[日期]) &&
    '销量表'[门店] IN ALLSELECTED('门店表'[门店]) //获取所有门店
    ))
    RETURN
    DIVIDE(Total_Sales,Count_Person,0)

再次修改之前的 每月每门店平均销售的RETURN部分

复制代码
每月每门店平均销售 = 
VAR Total_Sales = CALCULATE(SUM('销量表'[销售金额(元)]), FILTER(
                '销量表',
                '销量表'[销售日期] = SELECTEDVALUE('日期表'[日期]) &&
                '销量表'[门店] = SELECTEDVALUE('门店表'[门店])

))
VAR Count_Person = CALCULATE(SELECTEDVALUE('销量表'[店员数]),FILTER(
                '销量表',
                '销量表'[销售日期] = SELECTEDVALUE('日期表'[日期]) &&
                '销量表'[门店] = SELECTEDVALUE('门店表'[门店])

))
RETURN 
    IF(
        NOT ISINSCOPE('日期表'[日期]) && ISINSCOPE('门店表'[门店]), //总计行里
            [门店所有月平均销售],
            IF(ISINSCOPE('日期表'[日期]) && NOT ISINSCOPE('门店表'[门店]), //总计列里
                [每月所有门店平均销售], 
                DIVIDE(Total_Sales,Count_Person,0)
            )
    )

效果:

小技巧:

当同时有总计行和总计列时,有同学会头疼ISINSCOPE的条件,我们可以直接在矩阵里输出,帮助我们判断:

复制代码
ISINSCOPE('日期表'[日期]) & "," & ISINSCOPE('门店表'[门店])

根据得到的值来方便我们判断是否在总计行(列)里: