應用背景
數(shù)據(jù)的本質(zhì)是為了業(yè)務服務谎僻,從而達到更高效的工作方式窒朋,實現(xiàn)數(shù)據(jù)對業(yè)務的賦能和推動作用。
因此在構(gòu)建報表時腋粥,需要開發(fā)者有設計思維
晦雨,能夠考慮多種應用場景,幫助業(yè)務解決實際應用中的問題隘冲。
例如闹瞧,在實際業(yè)務場景中,管理層用戶習慣向下管理的方式对嚼,那么在查看報表時夹抗,能否也保留這種方式呢?
規(guī)則描述
組織架構(gòu)分為多級纵竖,1級漠烧、2級、3級靡砌,數(shù)字越小已脓,級別越高
上級用戶有權(quán)限查看下屬子部門數(shù)據(jù)
各級用戶在查看報表時,默認展開下級部門通殃,例如1級部門用戶度液,則展示下屬所有2級部門,以此類推
當用戶分管多個平級部門時画舌,則展示自身所在層級堕担,不進行展開
案例數(shù)據(jù)
圖1和圖2兩張事實表分別存儲Actual和Budget數(shù)據(jù)。
預算和實際存在掛在
父級部門不下放
的情況曲聂,因此事實表存在1級2級3級部門混合在一列的情況除了預算和實際存在此情況外霹购,有時候
項目
也會存在這種情況
圖3是維度表,存儲部門數(shù)據(jù)朋腋。
因為存在預算和實際不下放的情況齐疙,所以需要將本部門下落到子級膜楷,保證該部門的數(shù)據(jù)完整
除了保證數(shù)據(jù)完整,還要保證數(shù)據(jù)可進行鉆取贞奋,父級部門既可以看到下屬子級部門的數(shù)據(jù)赌厅,也可以看到掛靠在本部門的數(shù)據(jù)
圖4是維度表,存儲Actual和Budget的類別數(shù)據(jù)轿塔。
級別 | 字段1 | 字段2 | 字段3 |
---|---|---|---|
1 | 一級 | 一級 | 一級 |
1 | 一級 | 二級 | 二級 |
1 | 一級 | 二級 | 三級 |
2 | 一級 | 一級 | 一級 |
2 | 二級 | 二級 | 二級 |
2 | 二級 | 三級 | 三級 |
3 | 一級 | 一級 | 一級 |
3 | 二級 | 二級 | 二級 |
3 | 三級 | 三級 | 三級 |
圖5是多維的維度表特愿,本身是部門維度數(shù)據(jù)的變體。
多維表結(jié)構(gòu)圖勾缭,是多維表的設計理念
級別分為3級洽议,代表著部門的層級結(jié)構(gòu)
從權(quán)限管理的角度來說,子級部門不可以看到歸屬上級部門的數(shù)據(jù)
每個級別中漫拭,都有不屬于該級別的數(shù)據(jù),例如:2級部門中混稽,存在1級部門采驻,這個是為了保證測試時,每個級別的數(shù)據(jù)都是完整的匈勋,減少測試的工作量
圖6是配置表礼旅,存儲用戶的權(quán)限信息。
圖7是表模型洽洁,多維表和配置表不需要建立模型關(guān)系痘系。
構(gòu)建度量值
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] )
可視化結(jié)果
添加軸權(quán)限
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解析
變量Access是為了獲取當前用戶的
最大權(quán)限
,數(shù)字越小權(quán)限越大如果用戶有訪問此報表的權(quán)限饿自,但是權(quán)限表中沒有對應的權(quán)限數(shù)據(jù)汰翠,則該用戶為Admin權(quán)限,Access度量值需
要進行補0
操作變量AccessCount是為了獲取當前用戶的權(quán)限行數(shù)昭雌,因為存在一個
用戶管理多個部門
的情況變量AccessLevel是為了輸出參數(shù)复唤,實際場景中,如果用戶管理多個部門烛卧,全部展開下屬部門數(shù)據(jù)會變的特別多佛纫,因此不需要展開,僅需要展示同級即可
變量Result是
判斷用戶默認的查看層級
总放,如果用戶非3級部門呈宇,那么管理多個部門看本級,管理一個部門看子級局雄,3級部門則看本級
結(jié)果
從結(jié)果上看甥啄,權(quán)限控制展示的維度是正確的,但是展示的數(shù)據(jù)不正確哎榴,A的達成率應該是16.67%型豁,C的達成率應該是2.33%僵蛛。
產(chǎn)生原因
篩選器會將X軸的所有字段與列圖例里面的字段組合,重新構(gòu)建上下文
篩選器構(gòu)建上下文的過程中迎变,度量值03參與了此過程充尉,導致一部分值被排除在外了
類別維度表與部門維度表之間沒有直接關(guān)系,二者在一起有類似笛卡爾積的效果衣形,也對結(jié)果有影響
解決方案
度量值內(nèi)部權(quán)限判斷驼侠,不依賴于篩選器判斷
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 () )
結(jié)果如下:
度量值內(nèi)部屏蔽多余上下文干擾
08.AnalysisRateExcept =
CALCULATE (
DIVIDE ( [03.AnalysisActual], [04.AnalysisBudget] ),
ALLEXCEPT ( 'Dim_Analysis', 'Dim_Analysis'[L1] ),
ALL ( 'Dim_Type'[類別] )
)
結(jié)果如下:
計算組封裝,屏蔽干擾因素
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 () )
結(jié)果如下:
補充
若部門連接類別谆吴,類別連接事實表倒源,則不會存在此問題
上述問題的誘因,也存在笛卡爾積的原因句狼,導致內(nèi)部計值流發(fā)生了變化