PowerBI開發 第三篇:報表設計技巧


最近做了幾個PowerBI報表,對PowerBI的設計有了更深的理解,對數據的塑形(sharp data),不僅可以在Data Source中實現,例如在TSQL查詢腳本中,而且可以在PowerBI中實現,例如,向數據模型中添加自定義字段,或者在報表數據顯示時,根據數據表之間的關系做數據的統計。本文主要介紹數據的塑形和UI設計的微調。

 

我的PowerBI開發系列的文章目錄:PowerBI開發

一,創建數據列

PowerBI報表的數據分為數據源(Data Source)和數據模型(Data Model)。數據源(Data Source)的邏輯視圖是Query,默認情況下,Data Source和Query的結構(Schema)相同。用戶可以通過Power Query M語言增加自定義列修改Query的結構,Power Query M語言不會影響Data Source,只會修改Query導出的數據。默認情況下下,PowerBI按照Query把數據加載到Data Model中,默認情況下,Data Model和Query的結構(Schema)相同,用戶可以通過DAX表達式在Data Model上創建計算列(Calculated Column)和度量(Measure)。

1,自定義數據列

在Data View->Query Editor中,創建自定義數據列,使用的是M 公式(M formula ),M公式語言用於創建靈活性數據查詢,M公式對大小寫敏感。用戶添加自定義數據列,這會修改數據模型(Data Model)的架構,PowerBI向Data Model中添加數據列。

例如,創建MonthKey列,通過使用M公式,把DateKey(格式是:yyyyMMdd)轉換成MonthKey(格式是:yyyyMM)。

在對數據進行排序時,有時不能使用DAX表達式,此時必須使用M公式,例如,對班級(Class)進行排序,使用DAX的IF函數,按照班級(Class)名稱新建一個字段(Class Ordinal),

Class Ordinal = IF(Schools[Class]="一年級",1,IF(Schools[Class]="二年級",2,3))

設置Class按照Class Ordinal排序,PowerBI會拋出錯誤:

在這種情況下,必須使用M公式,在Schools Query中新增字段:

= Table.AddColumn(KustoQuery, "Class Ordinal", 
each if [Class]="一年級" then 1
    else if [Class]="二年級" then 2
    else if [Class]="三年級" then 3
    else 4) 

2,計算列(Calculated Column)

在Report View中,計算列用於從已經加載到數據模型(Model)中的數據,根據公式計算的數據列,這跟在Data Model中增加計算列是不同的,計算列是從數據模型中計算數據,不會修改數據模型,因此,計算列的值,只會出現在Report View 和Data View中。計算列使用DAX定義字段的數據值,基於加載到數據模型的數據和公式計算結果。計算列只計算一次,跟Report沒有交互行為,這意味着,計算列不會根據用於在Report Page上選擇的Filter,而動態計算表達式的值。

計算列的值是基於當前數據行,進行計算,每行有一個計算列的值。舉個例子,顯示最近一年的日期:

3,度量列(Measure)

度量值是在報表交互時對報表數據執行的聚合計算,度量值使用DAX定義字段的數據值,從數據模型中計算數據,不會修改數據模型,因此,度量值只會出現在Report View 和Data View中。度量值通常是用於聚合統計,基於用戶選擇的Filter,以顯示不同的聚合值,由於度量值是聚合值,不是每行都有一個聚合值。舉個例子,創建度量值 Answer Rate,其公式是:

Answer Rate = DISTINCTCOUNT(CloudThreads[AnsweredThreadID])/DISTINCTCOUNT(CloudThreads[ThreadID])

度量列能夠引用其他表的數據列,根據數據模型中的關系,能夠完成很多交互性的數據統計,非常強大,但是,也很繞、繞、繞……

二,報表可視化控件的設計

在顯示報表數據時,PowerBI提供多種方式,能夠對數據的顯示進行微調,使數據顯示的效果更合理。

1,層次結構( Hierarchy)

PowerBI 支持在Report View中創建字段的層次結構(Hierarchy),在同一個Query中,拖動一個字段到另一個字段下,PowerBI自動創建一個層次結構,並以父層次字段的名稱命名,例如:

PowerBI內置一個可視化控件HierarchySlicer,能夠顯示字段的層次結構,在Fields中設置一個層次結構:

控件顯示的結構是一個樹形結構,點擊“三角”,能夠展開,以樹形結構顯示子級別的數據,HierarchySlicer支持逐層展開,如下圖所示:

 

2,在Table控件中顯示超鏈接(HyperLink)

在Product View中,選中Query的某一個字段,如下圖,選中字段 ProfileLink,

 在Modeling菜單下,該字段的Data Type為Text,設置文本的Data Category為Web URL:

Table可視化控件的視圖屬性中,設置Values的URL Icon屬性為On,

 

在Table控件中,Web URL的顯示如下所示,點擊LInk,能夠直接打開瀏覽器,跳轉到指定的網址:

3,數字的小數位的控制

可以在PowerBI中設置字段的數據類型,選中一個字段,打開Modeling菜單,

 選擇字段的數據類型,Format為 Decimal number,選擇貨幣符號($), 顯示百分比(%),千位分隔符(,),或小數位數(0-N),這里設置 顯示的小數位數是1,只顯示一位小數。

 

顯示的效果如下,Score 保留一位小數點,並使用千位分割符號:

 

4,字段值的過濾

可視化(Visual)控件只顯示排名靠前的TOP N行數據,這可以通過為字段設置過濾條件來實現,在FIELDS列表中,點擊字段后面的”...“ ,添加過濾條件(Add filter),按照特定字段的值(By value),過濾當前字段的值:

例如,在一個Table visual中,把Filter Type設置為Top N,把Show items設置為Top 20,把By Value設置為度量值 Contribution Score,PowerBI按照度量值降序排列,只顯示排名前20的數據行:

PowerBI 支持兩種顯示的項目(Show item)類型:Top和Bottom,PowerBI按照排序值(by value)降序排名。

字段的過濾類型,共有三種,如下圖所示,可以根據需要,創建適合業務邏輯的過濾器:

三,根據當前的數據導出數據

在數據建模時,需要創建兩個表之間的關系,PowerBI要求跟關系相關的兩個數據列,必須有一列是唯一值,不允許存在重復值。在DimCalendar表中,存在DateKey列,該列是以int表示的日期類型,例如,2017年10月1日,用DateKey表示是20171001,從DimCalendar表中導出MonthKey,公式是MonthKey=DateKey/100。需要根據MonthKey列新建一個Query,做法是:

1,添加新的查詢(Query)

在查詢編輯器(Query Editor)中,選中列 MonthKey,右擊彈出快捷菜單,選擇“Add as New Query”,從當前列中新建查詢

2,把List轉換成Table

此時,新建的Query命名為MonthKey,是一個List類型,需要把List轉換成Table,選中該List,打開主菜單Transform,點擊“To table Convert”,把List轉換成Table

從一個List創建Table,PowerBI需要用戶選擇界定符,該List沒有任何界定符,選擇None:

3,修改數據

新表的數據列名是Column1,右擊彈出快捷菜單,點擊“Rename”,把該列重命名為MonthKey,點擊“Change Type”把該列的數據類型修改為“Whole Number”,點擊“Remove Duplicates”,刪除重復的數據值

4,查看導出數據表的實現步驟

在右側的查詢設置(Query Settings)中查看實現的步驟,選擇某一個Step,點擊Step 名稱前的“×”,能夠把該Step刪除。

 

 

附:鑒於本人接觸PowerBI的時間不長,cover的內容有限,后續有新的設計技巧,我會持續更新

 

參考文檔:

Tutorial: Create calculated columns in Power BI Desktop

Tutorial: Create your own measures in Power BI Desktop

Power Query M Reference

Hyperlinks in tables

Measures in Power BI Desktop

Calculated columns in Power BI Desktop


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM