微軟BI 之SSRS 系列 - 實現 Excel 中圖表結合的報表設計


來自群里面討論的一個問題,EXCEL 中有類似於這樣的圖形,上面是 Chart, Chart X軸上的值正好就是下方 Table 的列頭,這個在 SSRS 中應該如何實現?
 
SSRS 2008、2008RS,2012 中實際上沒有這種對應的控件,我們通常想到的方式可能是上方一個單獨的 Chart 圖,下方一個 Table 然后合並在一起。但是這樣會存在一些問題,因為 Chart 軸的值不是固定的,會隨着聚合值的增加而擴展。並且對於表中的列頭來說也沒有辦法完全能夠和 Chart X 軸上的坐標對應在一條豎線上,一定會有偏差。
 
在 SSRS 中,我們可以通過一些技巧來實現類似於這樣的效果。下面是我用 Column Chart 來展現的這種類似於 Excel 中的效果,雖然實現比較接近了,但我並不推薦這么做! 因為我們完全可以通過合理的變通,並使用其它的方式將這些數據展現的更加合理!  
 
原始測試數據 (AdventureWorksDW2012)就是一個簡單的查詢 - 
SELECT DPC.EnglishProductCategoryName, FIS.OrderDate, FIS.OrderDateKey, DD.CalendarYear, FIS.SalesOrderNumber, FIS.SalesOrderLineNumber, FIS.SalesAmount AS Internet_Sales FROM FactInternetSales AS FIS INNER JOIN DimProduct AS DP ON FIS.ProductKey = DP.ProductKey INNER JOIN DimProductSubcategory AS DPS ON DP.ProductSubcategoryKey = DPS.ProductSubcategoryKey INNER JOIN DimProductCategory AS DPC ON DPS.ProductCategoryKey = DPC.ProductCategoryKey INNER JOIN DimDate AS DD ON FIS.OrderDate = DD.FullDateAlternateKey

新建報表和數據集 Dataset,選擇 Matrix 行分組為 Product Category ,列分組為 Calendar year。

 
添加兩個新行 - 選擇 Outside Group - Above。
並刪除第一行。
刪除的時候只刪除行,但是不要連組給刪除了。
刪除之后的樣子就是這樣的。
第二行是表頭要顯示的年份,第一行用作行內 Column Chart 圖。
在第一行的這個位置插入 Data Bar,選擇 Stacked Column。
 
填充 Stacked Column 中的聚合值,分組以及系列。
填充完畢后就可以看到大致的效果了,每一列都是從 Matrix 列分組展開的,而每一列當中的 Column Chart 的分組又依賴於當前的列分組中的年份。
自行做一些美化工作,包括格式化等等。
存在一個問題,不同的系列是出來了,但是無法區分各個系列與產品分類的關系。
思路是 - Chart 圖中的顏色模板使用自定義的,然后使用自定義函數獲取指定的顏色,這幾種顏色需要和自定義模板中的顏色是一樣的。
Private colorPalette As String() = {"SeaGreen", "Orange", "RoyalBlue"} Private count As Integer = 0
    Private mapping As New System.Collections.Hashtable() Public Function GetColor(ByVal groupingValue As String) As String
        If mapping.ContainsKey(groupingValue) Then
            Return mapping(groupingValue) End If

        Dim c As String = colorPalette(count Mod colorPalette.Length) count = count + 1 mapping.Add(groupingValue, c) Return c End Function

報表的自定義函數。

 
設置 Stacked Column 圖的自定義模板顏色。
 
選中 English Product Category 文本框,設置它的背景顏色,調用函數。
=Code.GetColor(Fields!EnglishProductCategoryName.Value)
最后,要做出這種效果還需要進一步的格式化,調整邊框等操作使得這個 Stacked Column 像一個整體,而非單一的個體,這些美化的細節就不一一描述了。可以參考 天善學院微軟SSRS2012報表課程 基礎案例中的 - 案例6,案例13,案例18,案例24 以及 SSRS 報表設計提高篇中的報表美化與設計等案例。所以本文只講解實現的流程,過於細節的設計技巧,包括一些聚合分組的概念,自定義函數等不是本文的重點。
對於文章開頭看到的這種 Line Chart 形式可不可以做,也可以做,可以通過調整 Chart 區域折線的平面寬度使得幾個獨立的折線區域也連接成一個整體。但是像最左側的 Y 軸線如何實現,幾個產品不使用底線區分而要求使用 Chart 中自帶的系列又該顯示且不重復?這些都不是拖拖拽拽就可以實現的,這需要熟練掌握 SSRS 報表中的各種知識點和技能點,不同控件的組合使用技巧等。當然,如果就這個案例來說,假設實際開發中如果是我,我會拒絕設計這種樣子的報表,因為上圖很明顯在閱讀性和數據呈現上完全體現不出來像 Excel 展現出來的那種效果。
 
所以,在實際報表開發過程中,不能為了模仿而模仿,因為很有可能模仿成一個四不像。
 
吐吐口水吧! 在實際項目中,在引導客戶改變已有使用習慣,適應新的適應習慣的過程中往往確實是伴着口水,Fighting 的,包括遭受到客戶對自身能力的懷疑,這些在項目開發中都是很正常的。像有很多客戶往往會提出他們認為很好實現但實則很難實現的一些效果要求必須實現,這些極端情況也是客觀存在的。對於我來說,我也會遇到一些變態的和不合理的需求,但通常情況下我也會直接拒絕,坦誠告訴客戶無法實現,因為它已經違背了 SSRS 自身特性。但同時我也會嘗試拿出另多的替代的解決方案讓客戶來選擇,這樣客戶通常會比較容易接受和妥協。就像出門從北京到上海出差,告訴他們飛機確實因為技術原因就是不能飛,在客戶非要證明但又無法證明飛機就是能起飛的同時給他們選擇高鐵,汽車和自行車三選一,一般情況下客戶還是會從中選擇他最能夠接受的一種最優方案,因為誰也耗不起時間。

更多 BI 文章請參看 BI 系列隨筆列表 (SSIS, SSRS, SSAS, MDX, SQL Server)

如果覺得這篇文章看了對您有幫助,請幫助推薦,以方便他人在 BIWORK 博客推薦欄中快速看到這些文章。


 

 


免責聲明!

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



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