
應(yīng)用背景
數(shù)據(jù)的本質(zhì)是為了業(yè)務(wù)服務(wù),從而達(dá)到更高效的工作方式,實(shí)現(xiàn)數(shù)據(jù)對(duì)業(yè)務(wù)的賦能和推動(dòng)作用。
因此在構(gòu)建報(bào)表時(shí),需要開發(fā)者有設(shè)計(jì)思維,能夠考慮多種應(yīng)用場(chǎng)景,幫助業(yè)務(wù)解決實(shí)際應(yīng)用中的問題。
例如,在實(shí)際業(yè)務(wù)場(chǎng)景中,管理層用戶習(xí)慣向下管理的方式,那么在查看報(bào)表時(shí),能否也保留這種方式呢?
規(guī)則描述
組織架構(gòu)分為多級(jí),1級(jí)、2級(jí)、3級(jí),數(shù)字越小,級(jí)別越高
上級(jí)用戶有權(quán)限查看下屬子部門數(shù)據(jù)
各級(jí)用戶在查看報(bào)表時(shí),默認(rèn)展開下級(jí)部門,例如1級(jí)部門用戶,則展示下屬所有2級(jí)部門,以此類推
當(dāng)用戶分管多個(gè)平級(jí)部門時(shí),則展示自身所在層級(jí),不進(jìn)行展開
案例數(shù)據(jù)


圖1和圖2兩張事實(shí)表分別存儲(chǔ)Actual和Budget數(shù)據(jù)。
預(yù)算和實(shí)際存在掛在
父級(jí)部門不下放的情況,因此事實(shí)表存在1級(jí)2級(jí)3級(jí)部門混合在一列的情況除了預(yù)算和實(shí)際存在此情況外,有時(shí)候
項(xiàng)目也會(huì)存在這種情況

圖3是維度表,存儲(chǔ)部門數(shù)據(jù)。
因?yàn)榇嬖陬A(yù)算和實(shí)際不下放的情況,所以需要將本部門下落到子級(jí),保證該部門的數(shù)據(jù)完整
除了保證數(shù)據(jù)完整,還要保證數(shù)據(jù)可進(jìn)行鉆取,父級(jí)部門既可以看到下屬子級(jí)部門的數(shù)據(jù),也可以看到掛靠在本部門的數(shù)據(jù)

圖4是維度表,存儲(chǔ)Actual和Budget的類別數(shù)據(jù)。

| 級(jí)別 | 字段1 | 字段2 | 字段3 |
|---|---|---|---|
| 1 | 一級(jí) | 一級(jí) | 一級(jí) |
| 1 | 一級(jí) | 二級(jí) | 二級(jí) |
| 1 | 一級(jí) | 二級(jí) | 三級(jí) |
| 2 | 一級(jí) | 一級(jí) | 一級(jí) |
| 2 | 二級(jí) | 二級(jí) | 二級(jí) |
| 2 | 二級(jí) | 三級(jí) | 三級(jí) |
| 3 | 一級(jí) | 一級(jí) | 一級(jí) |
| 3 | 二級(jí) | 二級(jí) | 二級(jí) |
| 3 | 三級(jí) | 三級(jí) | 三級(jí) |
圖5是多維的維度表,本身是部門維度數(shù)據(jù)的變體。
多維表結(jié)構(gòu)圖,是多維表的設(shè)計(jì)理念
級(jí)別分為3級(jí),代表著部門的層級(jí)結(jié)構(gòu)
從權(quán)限管理的角度來說,子級(jí)部門不可以看到歸屬上級(jí)部門的數(shù)據(jù)
每個(gè)級(jí)別中,都有不屬于該級(jí)別的數(shù)據(jù),例如:2級(jí)部門中,存在1級(jí)部門,這個(gè)是為了保證測(cè)試時(shí),每個(gè)級(jí)別的數(shù)據(jù)都是完整的,減少測(cè)試的工作量

圖6是配置表,存儲(chǔ)用戶的權(quán)限信息。

圖7是表模型,多維表和配置表不需要建立模型關(guān)系。
構(gòu)建度量值
01.Actual =
SUM ( 'Fact_Act'[實(shí)際] )
02.Budget =
SUM ( 'Fact_Bud'[預(yù)算] )
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是為了獲取當(dāng)前用戶的
最大權(quán)限,數(shù)字越小權(quán)限越大如果用戶有訪問此報(bào)表的權(quán)限,但是權(quán)限表中沒有對(duì)應(yīng)的權(quán)限數(shù)據(jù),則該用戶為Admin權(quán)限,Access度量值需
要進(jìn)行補(bǔ)0操作變量AccessCount是為了獲取當(dāng)前用戶的權(quán)限行數(shù),因?yàn)榇嬖谝粋€(gè)
用戶管理多個(gè)部門的情況變量AccessLevel是為了輸出參數(shù),實(shí)際場(chǎng)景中,如果用戶管理多個(gè)部門,全部展開下屬部門數(shù)據(jù)會(huì)變的特別多,因此不需要展開,僅需要展示同級(jí)即可
變量Result是
判斷用戶默認(rèn)的查看層級(jí),如果用戶非3級(jí)部門,那么管理多個(gè)部門看本級(jí),管理一個(gè)部門看子級(jí),3級(jí)部門則看本級(jí)
結(jié)果

從結(jié)果上看,權(quán)限控制展示的維度是正確的,但是展示的數(shù)據(jù)不正確,A的達(dá)成率應(yīng)該是16.67%,C的達(dá)成率應(yīng)該是2.33%。
產(chǎn)生原因
篩選器會(huì)將X軸的所有字段與列圖例里面的字段組合,重新構(gòu)建上下文
篩選器構(gòu)建上下文的過程中,度量值03參與了此過程,導(dǎo)致一部分值被排除在外了
類別維度表與部門維度表之間沒有直接關(guān)系,二者在一起有類似笛卡爾積的效果,也對(duì)結(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é)果如下:

計(jì)算組封裝,屏蔽干擾因素
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é)果如下:

補(bǔ)充
若部門連接類別,類別連接事實(shí)表,則不會(huì)存在此問題
上述問題的誘因,也存在笛卡爾積的原因,導(dǎo)致內(nèi)部計(jì)值流發(fā)生了變化
特別鳴謝夕楓大佬


