在分析數據時,不可能總是對單個數據表進行分析,有時需要把多個數據表導入到PowerBI中,通過多個表中的數據及其關係來執行一些複雜的數據分析任務,因此,為準確計算分析的結果,需要在數據建模中,創建數據表之間的關係。在PowerBI中,關係(Relationship)是指數據表之間的基數(Cardin ...
在分析數據時,不可能總是對單個數據表進行分析,有時需要把多個數據表導入到PowerBI中,通過多個表中的數據及其關係來執行一些複雜的數據分析任務,因此,為準確計算分析的結果,需要在數據建模中,創建數據表之間的關係。在PowerBI中,關係(Relationship)是指數據表之間的基數(Cardinality)和交叉篩選方向(Cross Filter Direction)。
基數(Cardinality)
基數關係類似於關係表的外鍵引用,都是通過兩個數據表之間的單個數據列進行關聯,該數據列叫做查找列,兩個數據表之間的基數關係是1:1,或者1:N,或者N:1,基數關係表示的含義是:
- 多對一 (N:1):這是最常見的預設類型。這意味著一個表中的列可具有一個值的多個實例,而另一個相關表(常稱為查找表)僅具有一個值的一個實例。
- 一對一 (1:1):這意味著一個表中的列僅具有特定值的一個實例,而另一個相關表也是如此。
例如,TableA和TableB之間的基數關係是1:N,那麼TableA是TableB的查找表,TableB叫做引用表,在查找表中,查找列的值是唯一的,不允許存在重覆值,而在引用表中,查找列的值不唯一。
在PowerBI中,有時,引用表會引用查找表中不存在的數據,預設情況下,PowerBI會自動在查找表中增加一個查找值Blank,所有不存在於查找表中的值,都映射到Blank。
交叉篩選方向(Cross Filter Direction)
篩選方向是篩選的流向,表示一個篩選條件對其他相關表進行過濾,例如,TableA對TableB過濾,其篩選方向可以是雙向,或單向:
- 雙向:預設方向,這意味著為進行篩選,兩個表均被視為是同一個表,這非常適用於其周圍具有多個查找表的單個表。
- 單向:這意味著一個表只能對另外一個表進行篩選,而不能反向過濾。
一,雙向篩選關係
在星型結構中,中間是一個引用表,周圍是多個查找表,引用表和查找表之間的篩選關係是雙向的,如下所示:
通常情況下,雙向篩選用於星型結構,是預設的方向,但是,雙向篩選不太適合以下關係圖中的模式,在該模式中,篩選方向形成一個迴圈,對於此類關係模式,雙向篩選會創建一組語義不明的關係,例如,求取 TableX 中某個欄位的總和,如果選擇按照 TableY 中的某個欄位進行篩選,則不清楚篩選器應該如何流動,是通過頂部表,還是底部表進行流動?
如果雙向篩選導致數據關係的多義性,那麼,可以導入表格兩次(第二次使用其他名稱)以消除迴圈。 這會產生類似於星型架構的關係模式,藉助星型架構,所有關係均可設置為“雙向”。
二,創建間接關係
在PowerBI報表的關係中,直接關係是指關係的兩個表直接接觸,間接關係是指通過中間表建立關係的兩個數據表,間接關係關聯的兩個數據表不直接接觸,如下圖,數據表Students和StudentCourse之間的關係是直接關係,數據表Course和StudentCourse之間的關係是直接關係,而數據表Students和Courses之間通過StudentCourse建立間接關係。間接關係通過一系列有直接關係的數據表,能夠實現數據的交互,這是PowerBI自動實現的,為創建複雜的數據模型提供了支持,但是,在數據建模中使用間接關係時,務必謹慎,PowerBI對Filter選項的全選和不選的處理是有區別的。
1,使用以下腳本創建具有多層關係的數據表
腳本創建了四個表,分別是用於表示學生,課程,學生選課,學生演講,學生和課程之間的關係是1:N,學生和演講活動之間的關係是1:N
create table dbo.Courses ( CourseID int not null primary key clustered, CourseName varchar(32) not null ) create table dbo.Students ( StudentID int not null primary key clustered, StudentName varchar(64) not null ) create table dbo.StudentCourse ( StudentID int not null, CourseID int not null, constraint PK__StudentCourse primary key clustered(StudentID,CourseID) ) create table dbo.StudentSpeaker ( StudentID int not null, EventID int not null ) insert into dbo.Courses(CourseID,CourseName) values(1,'English'),(2,'Chinese') insert into dbo.Students(StudentID,StudentName) values(1,'stu_a'),(2,'stu_b'),(3,'stu_c'),(4,'stu_d') insert into dbo.StudentCourse(StudentID,CourseID) values(1,1),(2,1),(3,2) insert into dbo.StudentSpeaker(StudentID,EventID) values(1,101),(4,102)View Code
2,在Relationships視圖中,創建表之間的關係
基數關係(Cardinality)根據數據之間的關係創建,篩選方向根據過濾的邏輯設置。預設情況下,PowerBI會自動檢查(AutoDetect)數據之間的關係,根據檢查的結果(列名和列值的唯一性)自動創建關係,在Relationships視圖中,關係是一條有方向的折線,折線的兩端是數字,表示基數(Cardinality)關係,折線中間的有向箭頭表示篩選方向(Direction)。
PowerBI不會智能到盡善盡美,用戶需要根據數據內在的關係對PowerBI自動創建的關係進行修正,或者,例如,把數據表Students和StudentCourse之間的關係修改為:1:N和雙向篩選,雙擊關係(折線),彈出編輯關係(Edit Relationship)的窗體:
在每個表下方面板中,會顯示列名和示例數據。基數(Cardinality)關係是Many to one,其表達式是:*:1,表達式左邊的表位於上面,右邊的表位於下麵,用於建立關係的數據列是灰色選中狀態。交叉篩選方向(Cross filter direction)選擇Both,勾選“Make this relationship active”,點擊OK,完成關係的創建,如下圖,點擊關係(折線),用於建立關係的數據列處於選中狀態。
三,利用間接關係實現業務需求
報表需要實現的業務需求是:根據課程(Course)統計作為演講者(Speaker)的學生數量
在做報表時,必須熟悉數據和數據之間的關係,在數據表StudentCourse中,共有3個學生選課,學號分別是1、2和3,存在不選課的學生,而在數據表StudentSpeaker中,只有學號1的學生滿足條件,因此,根據課程(Course)統計作為演講者(Speaker)的學生數量的結果應該是:
- 選修English的學生數量是0;
- 修改Chinese的學生數量是1;
- 對所有課程做統計,學生數量是選修English和選修Chinese的數量之和,1(=0+1);
1,設置課程Filter
數據表Course是查找表,由於StudentCourse中的課程(CourseID)都存在於Course表中,所有,Slicer圖表中不存在Blank選項。
2,添加Card圖表,顯示統計數量
在Page中添加Card圖表(Visualizations),在圖表的Fields屬性中,選擇數據表SutdentSpeaker的StudentID欄位,屬性值自動變成:聚合函數+ of +欄位值。
3,設置聚合函數
由於一個學生,可能在多個活動(Event)中擔當演講者(Speaker),因此,必須對StudentID進行去重,在圖表的Fields屬性值“Count of StudentID” 中右擊,選擇聚合函數選擇Count(Distinct)
4,設置圖表的顯示屬性
切換到“刷子”Icon,禁用Category lable,啟用Title,修改Title Text、Font color,Alignment和Text Size,
5,分析報表數據
課程選擇Chinese,數量是Blank
課程選擇English,數量是1
選擇所有課程,數量是1
6,清洗數據
預設情況下,圖表不選擇任何課程(Course),數量是2,這個結果在邏輯上是“錯誤”的,對於沒有選擇任何選項的Filter,PowerBI不會做任何篩選關聯。
導致錯誤的原因是由於數據表StudentSpeaker出現臟數據,沒有選修任何課程的學生(本例是學號為4的學生)出現在StudentSpeaker數據表中,要修正查詢的結果,必須清洗臟數據。
四,編輯交互行為
選擇不同的CourseName,度量值Speaker#自動根據Filter做相應的數據過濾,重新統計數據,這種過濾的流向是單向的,由數據關係中的交叉過濾方向(Cross Filter Direction)決定,PowerBI允許在不修改關係的情況下,編輯Filter和度量值的交互行為,使報表中的不同圖表(Visiualization)選擇性地響應或不響應過濾條件(Filter)。
1,選擇Filter,切換到Format菜單,選擇“Edit Interactions”
2,編輯交互行為
預設情況下,Card圖表的Filter是選中,將其切換到禁止,這樣,選擇Course過濾器中的任何一個選項,都不會影響Card圖表顯示的數據值。
五,在數據建模中,要遵守一定的設計原則
在數據建模中,不僅需要屬性業務需求,而且需要熟悉數據及其關係,遵守一定的設計原則,能夠避免出現一些顯而易見的錯誤:
- 要根據業務需求,設計報表的過濾條件(Filer)和度量值;
- 過濾器是數據建模的出發點,根據過濾條件和數據之間內在的關係設計數據模型;
- 根據數據之間內在的關係,載入數據,保證數據表中不出現臟數據。
PowerBI系列的文章目錄:
參考文檔: