報表工具對比選型系列用例——過程計算

我們知道,報表呈現的數據常常並不是直接從數據庫(源)取出來的數據,而還要進行一些運算,報表工具通常也會提供一定的運算能力(如過濾、分組等)以應對這種需求。但是,情況複雜時,報表數據集上的運算可能要多個步驟才能完成,這時候就要考查報表工具對過程式計算的支持程度了。

用例說明

統計要求

列出指定時段的大客戶。所謂大客戶,定義爲銷售額佔前一半的客戶,也就是把客戶銷售額從大到小排序後,前面若干個客戶的合計銷售額構成總銷售的一半,這些客戶被稱爲大客戶。

報表式樣

imagepng

數據結構

[銷售記錄表]

imagepng

特點分析:

這個報表式樣很簡單,主要麻煩之處在於需要從原始數據集計算出大客戶後再呈現,而這個計算並不是簡單一步能完成的。

我們的重點是考查報表工具的過程計算能力,所以假定不使用 SQL 或數據源的計算能力來完成。

潤乾報表

製作過程:

1、 配置並連接數據源。

2、 設置數據集

潤乾報表提供了一個獨立的計算引擎,可以通過內置的腳本實現對數據的計算並將結果返回給報表數據集,在報表中新增數據集,數據集類型使用腳本數據集,腳本如下:

imagepng

2.1 A1 格:單元格做了數據源的連接,然後 A6 單元格在執行完畢後關閉連接。

2.2 A2:從客戶銷售表中取數,此處根據客戶名稱做了彙總,並且按照銷售額降序排序。

2.3 A3:對銷售額進行求和操作並處以 2,取出總金額的一半,用於判斷大客戶。B3 設置初始值爲 0,用於做銷售額累加操作

2.4 A4:對銷售額進行累加,取出累加金額大於 A3 中對應的 A2 的序號

2.5 A5:根據序號取 A2 中對應的值,並做爲結果集返回給報表

3、 設計報表模板

imagepng

腳本數據集中返回的數據就是大客戶的數據信息,所以製作報表就相當簡單, 設置如下::

3.1、 A2、B2 單元格直接取數據集中的數據

3.2、 B3、B4 單元格直接用數據集彙總函數,對數據集計數取出大客戶數量,對銷售額用 avg 函數取出平均銷售額。

3.3、 設置邊框、金額顯示格式。

運行結果

imagepng

完成後點評

1、 0.5 小時,使用腳本數據集中內置的語法,幾個單元格的處理就能快速實現需求。

2、 可以使用腳本數據集,內置豐富語法規則,能快速處理各種複雜的數據統計要求。

3、 報表設計簡單,並且不需要輔助單元格,報表計算效率高。

帆軟報表

製作過程:

1、 配置並連接數據源。

2、 設置數據集

增加數據庫查詢,SQL 爲: SELECT 客戶,sum(銷售額) 銷售額 FROM DEMO. 客戶銷售表 group by 客戶 order by 銷售額 desc

3、 設計報表模板

imagepng

3.1 B2 單元格取總銷售額的一半,用於判斷大客戶,單元格內對銷售額求和,並設置自定義顯示公式 $$$/2,帆軟對字段彙總後如果再進行計算,無法直接在單元格里手動加表達式,只能設置自定義顯示公式。

3.2 A3、B3 單元格取數數據集中的客戶和銷售額字段。

3.3 C3: 求累計金額,=B3+C3[A3:-1],增加條件屬性,對非大客戶的數據進行隱藏。

imagepng

3.4 B4: 大客戶數量,=count(B3[!0;!0]{C3 <= B2 || (C3[A3:-1] < B2 && C3 >= B2)}),用 count 函數統計累計銷售大於總銷售額一般的數量。

3.5 平均銷售額,=sum(B3[!0;!0]{C3 <= B2 || (C3[A3:-1] < B2 && C3 >= B2)}) / B4,設置單元格的格式保留兩位小數。

3.6 將不需要展現的行列設置隱藏。

報表結果

imagepng

完成後點評

1、 用時 1 小時。

2、 累計實現可以通過內置的層次函數 LAYERTOTAL(B1, C1, D1) 實現,也可以通過層次座標, 本例使用的是層次做表方式,內置功能比較豐富。

3、 可以根據條件公式動態設置報表行列的動態隱藏。

4、 需要增加輔助單元格,會增加額外資源的耗用,尤其是客戶數量多時,報表中是取出了所有客戶信息(小客戶數量常常多得多),然後再判斷隱藏,數據量大時報表計算性能會有影響。

Smartbi

製作過程

1、 配置並連接數據源。

2、 設置數據集

採用原生 SQL 數據集,直接通過 SQL 語句取數就行:

select 客戶,sum(銷售額) 金額 from 客戶銷售表 group by 客戶 order by 金額 desc。

3、 設計報表模板

imagepng

報表的設計在 excel 內完成,藉助豐富的 excel 函數,smartbi 解決這種格間運算也不是太麻煩。如幾個關鍵計算:

3.1 D1:所有客戶的銷售總金額,D2 中寫入表達式 =D1/2, 取總銷售額的一半。

3.2 D3 格:累積金額,=SSR_GetCell(D3,B3,-1)+C3。

3.3 E3:=IF(SSR_GetSubCells(D3,B3)>D2,1+SSR_GetCell(E3,B3,-1),0),根據累積金額,標識當出現累積金額大於總金額一半的時候 標識爲 1,後面累計值依然大於總金額一半,數值累計爲 2/3/4(用於隱藏後面不要的數據)等

3.4 C4 格:=MATCH(1,SSR_GetSubCells(E3,A3),0),根據 E3 的標識,查找第一個出現的 1 所在的序號,該序號即標識大客戶數。

3.5 C5 格:平均銷售額相對簡單,=D4/C4,並設置報表中數據顯示格式

3.6 隱藏行設置,需要隱藏掉非大客戶數據,不支持表格內定義隱藏表達式,這裏根據 E3 值大於 1 的就隱藏,要藉助平臺給電子表格設置宏(需要寫 js 代碼)實現:

imagepng

運行結果

imagepng

完成後點評:

1、 用時:1.5 小時。

2、 完全在 excel 中操作,容易上手,操作起來比較方便。excel 函數豐富,這個報表主要是其查找類函數的使用。

3、 隱藏不需要(除大客戶外)的客戶數據時,不支持表格內定義隱藏表達式,需要 js 代碼才能實現,難度較大。

4、 需要增加輔助單元格,會增加額外資源的耗用,尤其是客戶數量多時,報表中是取出了所有客戶信息(小客戶數量常常多得多),然後再判斷隱藏,數據量大時報表計算性能會有影響。

永洪 BI

製作過程:

1、 配置並連接數據源。

2、 設置數據集

使用 SQL 語句數據集:select 客戶,sum(銷售額) 金額 from 客戶銷售表 group by 客戶 order by 金額 desc

3、 設計報表模板

imagepng

3.1 第一列增加了個按銷售額取數,實際中發現數據集中雖然按照銷售額排序了,但是直接取出客戶名稱字段時,即使不排序,也不會按照數據集原有數據排序,所以前邊增加了個銷售額字段,並且設置降序排序。

3.2 第四列中取出了總銷售額以及對應的累計銷售額,累計銷售額直接拖拽,設置下格間計算未累計就行

3.3 大客戶數量單元格使用格間計算,裏邊表達式爲:

var a=0;

for(var i=1;i<=ridx-1;i++){

if(cell(i,3)>=cell(0,3)/2){

a=i;

break;

}

}

通過 js 語法,對行列循環,判斷累計值是否大於銷售額總計的一半,返回對應行數也就是數量。

3.4 大客戶平均銷售額同樣的做法:

var a=0;

for(var i=1;i<=ridx-2;i++){

if(cell(i,3)>=cell(0,3)/2){

a=cell(i,3)/i;

break;

}

}

3.5 第一列和第四列是輔助列,右側有個隱藏列設置,將這兩列隱藏掉

3.6 隱藏行設置,永洪不支持單元格隱藏行表達式,如果要隱藏掉非大客戶數據,需要通過 js 語句實現,可以在 js 中獲取到報表計算後的行屬性,根據 3.3 中獲取的大客戶數量動態設置非大客戶(報表計算後行號超過大客戶數量的行)行高爲 0,來達到隱藏的效果,這個和 Smartbi 有些類似,這裏就不具體實現了。

運行結果

imagepng

完成後點評

1、 用時 2 小時,格間計算那幾個單元格處理時間較長,比較考驗開發能力。

2、 格間計算中可以用 js 語法進行數據的計算,適合開發人員操作,比較靈活, 但同時內置函數少,比較考驗開發人員能力。

3、 累計設置比較方便,直接用內置的語法就行。

4、 排序設置有問題,數據集中設置了數據的排序,但是報表裏默認不會按照相應的順序排序(也可能沒找到方法)。

5、 需要增加輔助列來實現,比如累計列,如果數據量大會額外佔用內存空間。

6、 可以設置隱藏列,但是設置後設計界面也就無法看到該列,無法還原,而且如果數據集變動而隱藏列裏引用了變動前的字段,很難更改。

7、 需要增加輔助單元格,會增加額外資源的耗用,尤其是客戶數量多時,報表中是取出了所有客戶信息(小客戶數量常常多得多),然後再判斷隱藏,數據量大時報表計算性能會有影響。並且隱藏掉非大客戶信息時,需要寫複雜的 js,難度較大。

億信

製作過程

1、 配置並鏈接數據源

2、 設置數據集

直接通過 SQL 語句取數就行:SQL 語句爲:select customer,sum(sales) as sales from sales group by customer order by sum(sales) desc

3、 設計報表模板

imagepng

3.1 A1:=sum(TEST.sales)/2 計算所有客戶的銷售總金額的一半,並在右側屬性裏設置隱藏屬性

3.2 A3:=TEST.customer 浮動維字段,同時在右側設置排序的依據是 B3。

3.3 C3:=self.leftcell.value+self.upcell.value 實現金額累計計算

3.4 D3:=if(GRID1.C3.upcell.value<GRID1.A1,1,null) 將累計金額大於 A1 單元格值的數據標識爲 1,不符合條件的標識爲 null,方便後面統計數量。

3.5 B4:=sum(GRID1.D3$),根據 D3 的標識統計出來大客戶數量(D3 中大客戶返回 1,對 1 求和就是大客戶數量)

3.6 B5:=GRID1.D3$.select(@.value=1).select(true,@.leftcell(2).value).avg() 先使用數組的方式過濾出來對應的數據,然後再進行求平均的計算

3.7 選中第 3 行設置顯示錶達式爲:<#=if(GRID1.D3=1,1,0)#>,D3 單元格標識出了本條數據是否是大客戶,這裏根據 D3 單元格值控制本行是否顯示(如果爲 1 則返回 1 表示顯示,否則返回 0 不顯示)

運行結果

imagepng

完成後點評:

1、 製作用時:1.5 小時

2、 內置函數比較豐富,本表中常用操作基本上都是通過內置函數實現。

3、 可以根據條件公式動態設置報表行列的動態隱藏,比較方便。

4、 需要增加輔助單元格,會增加額外資源的耗用,尤其是客戶數量多時,報表中是取出了所有客戶信息(小客戶數量常常多得多),然後再判斷隱藏,數據量大時報表計算性能會有影響。

總結

  1. 這個例子報表結果格式相對比較簡單,各個報表工具基本上都能實現。

  2. 對於本例中考查的過程計算,帆軟、Smartbi、永洪、億信這四款工具實現方法基本一致,都是通過輔助行列取出銷售額總計、累計銷售額,然後進行數據判斷來確定哪些客戶是大客戶並對數據統計,最後將輔助行列再隱藏掉。整個過程有一定的難度和繁瑣度,這是因爲報表只能執行狀態式計算,用來處理過程計算就只能採取這種迂迴的辦法。

  3. 這幾款產品之間來看,帆軟、Smartbi、億信基本上一致,都是使用內置函數或者方法實現,隱藏行列也比較方便。而永洪累計實現方便,直接通過鼠標設置就行,但是做數據統計時就要寫複雜的 javascript 語法來統計,這塊實現難度比較大,而且隱藏行列設置也不太方便。永洪的複雜報表功能相比其它三款要更弱一點,帆軟在這四款中相對更好,這和之前測試其它案例的結論也一致。

  4. 潤乾事實上也可以採用隱藏格手段實現,但我們在這裏則提供了一種與衆不同的方法。潤乾增加了一個計算層,使用腳本數據集,可以更方便地實現過程式計算,返回給報表就是處理後的數據結果,報表中不再做特別處理,整體過程更爲簡單,而且消耗資源也比使用輔助格要少得多,性能會更優。仍然是和之前測試案例的結論一致,潤乾是這幾款產品中擁有最強計算能力的產品,計算層明顯拉開了和其它產品的差距,這對於高效開發複雜報表是至關重要的。

進一步的例子

我們再通過一個例子在看計算層的意義,查詢股票最長連續上漲的天數:

imagepng

數據源是一個文本,記錄各支股票的每天的收盤價:

imagepng

這個報表的樣式也很簡單,但計算過程要更爲繁瑣:需要先將按日期過濾後的數據集按股票代碼分組,再計算出每組股票連續上漲的天數,然後再過濾出超過 5 天的股票。

這種複雜的過程,如果沒有計算層的協助,使用隱藏格就是個非常麻煩的過程,大體描述如下:

1、 取出文本數據集,放入單元格中

2、 設置排序,按股票代碼和日期排序

3、 按股票代碼分組,做成兩層報表

4、 在明細行增加輔助格計算連續上漲的天數

5、 在分組行計算最大連續上漲的天數

6、 將明細行隱藏

7、 將非指定日期和不滿足條件的分組隱藏。

這個過程,對於帆軟這種格間計算能力較強的報表工具,還只是繁瑣;而 Smartbi、永洪和億信這些就不只是繁瑣的問題,中間的計算也很難表達。並且,無論是哪一款工具,都會導致整個報表臃腫,有大量的隱藏格(遠遠多於呈現出來的格子)。

要避免這些,實際使用的辦法常常會藉助自定義數據源,用 Java 讀出數據把結果集計算好,或者把數據導入數據庫用 SQL 來算。無論哪種方法,都依然非常繁瑣,嚴重影響開發效率。

但是,如果像潤乾報表一樣有個可解釋執行的計算層的話,那就會很簡單,實現這個邏輯也不需要幾行代碼:

imagepng

A1 :=file(“F:/ 股票信息.txt”).import@t().select(left(string(Date),7)==rq), 讀取股票信息中的數據,並根據報表中傳入的 rq 參數進行數據過濾,取某月數據

A2:=A1.sort(Date).group(SID),按照日期排序,並根據 SID 字段分組

A3:go=A2.new(SID, ~.group@i(Closing>Closing\[-1\]).max(~.len()):ts),Closing[-1] 取當前記錄上一條的收盤價,A3 中根據同一只股票當天收盤大於前一天收盤價來取最大連續上漲天數。

A4:return A3.select(ts>=5),取出 A3 中最大連續上漲天數大於 5 的數據,返回給報表數據集使用。

由於腳本數據集中已經處理好了數據,報表中製作就相當簡單了,就不用具體解釋了。

複雜報表最後的結論

我們用了三篇文章對比了這五款以複雜報表能力爲宣傳點的報表工具:
報表工具對比選型系列用例——多源分片報表

報表工具對比選型系列用例——排名及跨行組統計
總體結論如下:

  1. 潤乾的優勢非常明顯,即使不考慮它特有的計算層,其複雜報表能力也是這五款產品中最強的。再加上計算層,可以說是遙遙領先,和其它幾款產品相比已經差出檔次了。

  2. 帆軟居次,如果拋開潤乾特有的計算層,帆軟的複雜報表能力和潤乾相比還是會弱,但相差不算很大了,而且帆軟友好的界面能夠再加分,可以認爲潤乾和帆軟是第一檔的產品,把複雜報表作爲宣傳點都算是名符其實的。

  3. Smartbi 就要弱一些,模型基本實現了,但表達式細節和潤乾帆軟差得不少,可以算作是第二檔的產品。把複雜報表作爲宣傳點,在 BI 領域中也還勉強說得過去。

  4. 永洪和億信,嚴格地說,其複雜報表能力還處於沒入門的階段,和其它幾款產品相比的差距非常大。只能算作第三檔甚至不入檔的產品了,其實這兩款產品本來是 BI 色彩很強的產品,把複雜報表作爲宣傳點就有點名不符實了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章