BI学习笔记

设计者思维丨权限轴

2024-06-29  本文已影响0人  Fabric丨白茶

应用背景

数据的本质是为了业务服务,从而达到更高效的工作方式,实现数据对业务的赋能和推动作用。
因此在构建报表时,需要开发者有设计思维,能够考虑多种应用场景,帮助业务解决实际应用中的问题。
例如,在实际业务场景中,管理层用户习惯向下管理的方式,那么在查看报表时,能否也保留这种方式呢?

规则描述

案例数据


图1和图2两张事实表分别存储Actual和Budget数据。

图3是维度表,存储部门数据。

图4是维度表,存储Actual和Budget的类别数据。

级别 字段1 字段2 字段3
1 一级 一级 一级
1 一级 二级 二级
1 一级 二级 三级
2 一级 一级 一级
2 二级 二级 二级
2 二级 三级 三级
3 一级 一级 一级
3 二级 二级 二级
3 三级 三级 三级

图5是多维的维度表,本身是部门维度数据的变体。

图6是配置表,存储用户的权限信息。

图7是表模型,多维表和配置表不需要建立模型关系。

构建度量值

01.Actual = 
SUM ( 'Fact_Act'[实际] )
02.Budget =
SUM ( 'Fact_Bud'[预算] )
03.AnalysisActual =
VAR Analysis=
    VALUES ('Dim_Analysis'[L3])
VAR Result=
    CALCULATE ([01.Actual], FILTER ('Dim_Dept','Dim_Dept'[部门2] IN Analysis))
RETURN
    Result
04.AnalysisBudget =
VAR Analysis=
    VALUES ('Dim_Analysis'[L3])
VAR Result=
    CALCULATE ([02.Budget], FILTER ('Dim_Dept','Dim_Dept'[部门2] IN Analysis))
RETURN
    Result
05.AnalysisRate = 
DIVIDE ( [03.AnalysisActual], [04.AnalysisBudget] )

可视化结果

添加轴权限

06.DisplayLevel =
VAR Access =
    CALCULATE (
        MIN ( 'Config_Access'[ID_DepartmentLevel] ),
        'Config_Access'[LB_AdAccount] = USERNAME ()
    ) + 0
VAR AccessCount =
    COUNTROWS (
        CALCULATETABLE (
            VALUES ( 'Config_Access'[LB_Accessible] ),
            'Config_Access'[LB_AdAccount] = USERNAME (),
            'Config_Access'[ID_DepartmentLevel] = Access
        )
    )
VAR AccessLevel =
    IF ( AccessCount > 1 && Access <> 0, Access - 1, Access )
VAR Result =
    IF (
        AccessLevel <> 3,
        VALUE ( MIN ( 'Dim_Analysis'[LB_LEVEL] ) ) - AccessLevel,
        VALUE ( MIN ( 'Dim_Analysis'[LB_LEVEL] ) ) - 2
    )
RETURN
    Result

DAX解析

结果

从结果上看,权限控制展示的维度是正确的,但是展示的数据不正确,A的达成率应该是16.67%,C的达成率应该是2.33%。

产生原因

解决方案

度量值内部权限判断,不依赖于筛选器判断

07.DisplayRate =
VAR Access=
    CALCULATE (
        MIN ('Config_Access'[ID_DepartmentLevel]),
'Config_Access'[LB_AdAccount]= USERNAME ()
)+0
VAR AccessCount=
    COUNTROWS (
        CALCULATETABLE (
            VALUES ('Config_Access'[LB_Accessible]),
'Config_Access'[LB_AdAccount]= USERNAME (),
'Config_Access'[ID_DepartmentLevel]=Access
)
)
VAR AccessLevel=
    IF (AccessCount>1&&Access<>0,Access-1,Access)
VAR Result=
    IF (
AccessLevel<>3,
        VALUE ( MIN ('Dim_Analysis'[LB_LEVEL]))-AccessLevel,
        VALUE ( MIN ('Dim_Analysis'[LB_LEVEL]))-2
)
RETURN
    IF (Result=1,[05.AnalysisRate], BLANK () )

结果如下:

度量值内部屏蔽多余上下文干扰

08.AnalysisRateExcept =
CALCULATE (
    DIVIDE ( [03.AnalysisActual], [04.AnalysisBudget] ),
    ALLEXCEPT ( 'Dim_Analysis', 'Dim_Analysis'[L1] ),
    ALL ( 'Dim_Type'[类别] )
)

结果如下:

计算组封装,屏蔽干扰因素

VAR Access =
    CALCULATE (
        MIN ('Config_Access'[ID_DepartmentLevel]),
'Config_Access'[LB_AdAccount]= USERNAME ()
)+0
VAR AccessCount=
    COUNTROWS (
        CALCULATETABLE (
            VALUES ('Config_Access'[LB_Accessible]),
'Config_Access'[LB_AdAccount]= USERNAME (),
'Config_Access'[ID_DepartmentLevel]=Access
)
)
VAR AccessLevel=
    IF (AccessCount>1&&Access<>0,Access-1,Access)
VAR Result=
    IF (
AccessLevel<>3,
        VALUE ( MIN ('Dim_Analysis'[LB_LEVEL]))-AccessLevel,
        VALUE ( MIN ('Dim_Analysis'[LB_LEVEL]))-2
)
RETURN
    IF (Result=1, SELECTEDMEASURE (), BLANK () )

结果如下:

补充

特别鸣谢夕枫大佬



上一篇 下一篇

猜你喜欢

热点阅读