報表也可以根據單元格計算後結果進行排序

bubblegum發表於2019-12-18

熟悉報表的人都知道,報表中實現資料排序通常有三種方法:

1、 在 sql 語句中增加 order by,如 order by id asc

2、 select 函式取數時,指定排序欄位,如 ds1.select(name:-1),或者按照其他欄位排序,如 ds1.select(EMPID, ,,;NAME:1) 按照 NAME 欄位升序排序

3、 還可以按照某欄位彙總後的結果進行排序,如:ds1.group(省份; 省份:1; ds1.sum( 工業產值):-1),對資料集 ds1 按照省份進行分組,分組後求出每組的 sum( 工業產值),然後按照這個彙總值對組進行逆序排列

可以看到,這三種方式有一個共性,排序欄位的資料都儲存在資料庫中。但是,在實際使用中,資料經常會在報表單元格中進行運算(比如單元格資料乘以一個係數然後再和其他單元格資料相加等),而此時如果要根據計算後的單元格資料進行排序,上述三種方法就無法做到了。

下面,我們就介紹一下如何實現這種需求,基於單元格計算後的資料進行排序。

思路

我們首先分析一下排序操作是怎麼做的:按照某列資料排序,實際上是先算出該資料的“排名”,然後根據排名的“順序”對資料進行重新排序。因此主要有兩部分操作,一是如何生成排名,二如何根據排名重新對資料排序。

下面就按照這個思路實現一個實際例子。

首先,按照使用者需求先將資料取出來以網格式方式展現,設計後的模板如下:

1jpg

前幾列按照實際需要將相應欄位拖拽到單元格中即可,在 E3 單元格中,對運貨費進行了單元格間的計算操作,需要解決的問題就是根據 E3 單元格資料進行排序。

接下來先生成 E3 的排名,排名寫法比較固定,在報表後追加一列,在 F3 單元格中寫入表示式:=count(E3[`0]{E3>$E3})+1,統計 E3 擴充套件出來的列中大於當前 E3 單元格的數量加 1,即為當前 E3 的排名。

好,現在排名生成了,看下如何基於排名重新對資料進行排序。

在報表第一列前插入一列,下邊追加一行,在 A4 單元格中寫入表示式:=to(1,count(B3{})),根據擴充套件區域重新模擬出一片擴充套件,如下圖:

2jpg

接下來就可以使用報表的動態格間計算功能,根據 G3(排名)和 A4 關聯,重新在第四行取出想要的資料,在 B4 單元格中寫入表示式:=B3{G3==$A4},該表示式含義為在 B4 單元格中取出排名(G3)和當前行相同的 B3 的值,並將 B3 單元格的擴充套件方向設定“縱向擴充套件”,報表預覽如下:

3jpg

可以看到,在 B 列中能夠取到相應的 ID 值,其中,排名 6 和 8 都有兩條記錄,這是因為運貨費單元格有相同的值,所以排名相同。

B 列中取出了訂單 ID 的值,剩餘單元格使用資料集. 欄位名取數就可以了,如下圖:

4jpg

而原來的第三行資料作為中間資料,可以隱藏掉,同時將 A 列和 G 列也隱藏掉。

因為有相同資料,所以同一個排名會出現多條,相應的,有的名次下就會有空資料,例如因為有兩個第 6 名,所以沒有就沒有第 7 名,為此我們在 B4 單元格的隱藏行表示式中寫入:value()==null。剩下就可以根據實際需要設定報表樣式了,最終展示結果如下:

5jpg

可以看到,報表已經按照實際運費列的順序從大到小排序了。

總結:

本文的例子中,首先根據單元格的順序生成排名,然後在透過 to 函式模擬出一片資料進行擴充套件,再根據排名的名次重新獲取需要的資料,這樣就可以按照在單元格中經過複雜運算後的結果進行排序了。在實際應用中,還可以在表頭中增加超連結,控制升序或者降序排序,具體的做法只需要在點選時控制 to 函式是從小到大還是從大到小擴充套件就可以了。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69957599/viewspace-2669218/,如需轉載,請註明出處,否則將追究法律責任。

相關文章