1. 概述
1.1 問題描述
資料集中我們可以用 SQL 語句中 order by A,B 語句,將結果先按照 A 排序,再按照 B 來排序。那麼設計器中如何使用「擴展後排序」實現多列排序呢?
例如:擴展後結果先按照「銷售員」排序,相同的銷售員再按照「銷量」排序,如下圖所示:
1.2 解決思路
1)字元類型的資料可以透過INARRAY(字元, SORTARRAY(UNIQUEARRAY(擴展的所有字元)))獲得排序位置。
2)數值類型的資料直接透過本身的大小排序。
將 1)和 2)的結果經過運算處理得出一個新的數值,最後按照新數進行排序。
2. 範例
2.1 準備資料
建立普通報表,建立資料庫查詢 ds1,輸入 SQL 語句:SELECT * FROM 銷量 where 地區='華北'
2.2 設計表格
1)將資料集中的欄位依次拖入 A2~E2 儲存格,表格如下圖所示:
2)將 A2 儲存格資料設定為「列表」,如下圖所示:
2.3 設定擴展後排序
選中 A2 儲存格,設定「擴展後排序」為「升冪」,輸入公式:INARRAY(B2,SORTARRAY(UNIQUEARRAY(B2[!0])))*POWER(10, LEN(MAX(E2[!0])))+E2
這個公式涉及到 B2 和 E2 儲存格的組合計算,正是這種組合計算實現了先 B2 排序,再 E2 排序的效果。公式拆解說明如下:
部分 | 說明 |
---|---|
SORTARRAY(UNIQUEARRAY(B2[!0])) | B2 儲存格是正文資料,所以要使用 SORTARRAY 函式對其進行排序 |
INARRAY(B2,SORTARRAY(UNIQUEARRAY(B2[!0]))) | SORTARRAY 函式已經將 B2 排好序了,且資料儲存為陣列 再使用 INARRAY 函式匯出陣列裏面每個正文資料的位置 就是將排好序的正文轉化為數字,方便後面跟 E2 組合計算,再對 E2 排序 |
*POWER(10, LEN(MAX(E2[!0]))) | 這是個固定的乘冪,前面公式乘這個數,就是為了將代表正文位置的數字增大 為什麼要增大這個數呢?這是因為後面還要加上 E2,如果只是用1、2、3這樣比較小的數,加上 E2 後會影響到 B2 排序 |
+E2 | B2 儲存格相同時,組內根據加上的 E2 儲存格數值,得到的和再進行組內排序 也就是在 B2 排好序的基礎上,再對 E2 排序 |
步驟如下圖所示:
2.4 效果預覽
1)PC 端
儲存報表,點選分頁預覽,效果如 1.1問題描述 中所示 。
2)行動端
App 和 HTML5 端均支援,效果如下圖所示:
3. 範本下載
已完成範本可參見:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\擴展後多列排序.cpt
點選下載範本:擴展後多列排序.cpt