1. 概述
1.1 預期效果
有時使用者希望在同一張報表中,可以實現分組動態排序且互不影響的效果。例如當點選華東的銷量時,華東的銷量改變排序,華北的銷量不受到影響;當點選華北的銷量時,華北的銷量改變排序,華東的銷量不受到影響。如下圖所示:
1.2 實現思路
第一步:根據「地區」的數量定義成一個陣列長度,用陣列中的元素儲存對應分組的升降冪(正數 1 為升冪,負數 -1 為降冪)。
第二步:當點選銷量時,先刪除陣列中點選位置對應的值,再將變為相反數的值插入到陣列中對應的位置。
第三步:設定擴展後排序,先獲取點選位置對應的陣列中的值,再乘以「銷量」所在分組中儲存格的值,按正負數的升冪改變排序。
2. 範例
2.1 資料準備
建立普通報表,建立資料庫查詢 ds1,寫入 SQL 語句:SELECT * FROM 銷量 where 產品='蘋果汁'。
2.2 報表設計
合併 A1~D1 儲存格,將「地區」資料欄拖入儲存格 A1,A2~D2 儲存格輸入如下圖所示標題,A3~D3 儲存格拖入對應的資料欄。
將 A3 儲存格左父格設定為 A1。自行設定表格樣式,最終效果如下圖所示:
2.3 設定動態參數
選中 D2 儲存格,給其新增一個「超級連結>動態參數」,參數名為 a,參數值選擇「公式」類型,輸入公式:JOINARRAY(ADD2ARRAY(REMOVEARRAY(IF(LEN($a) = 0, RANGE(COUNT(A1[!0]))*0, SPLIT($a, ",")), &A1, 1), IF(INDEXOFARRAY(SPLIT($a, ","), &A1) = 1, -1, 1), &A1),",")
動態參數的作用是點選「銷量」時,能按照公式定義的規則傳回參數,再根據參數進行排序。
公式說明如下:
1)步驟一:IF(LEN($a) = 0, RANGE(COUNT(A1[!0]))*0, SPLIT($a, ","))
公式 | 說明 |
---|---|
LEN($a) = 0 | 初始化報表時,參數 a 為空,即長度等於 0,第一次點選後即被指派 |
RANGE(COUNT(A1[!0]))*0 | 合計 A1 儲存格擴展的值,定義一個長度與值同等的陣列,乘以 0 是為了避免第一次點選排序時參數值均發生變化 |
SPLIT($a, ",") | 參數在傳遞程式中會被自動處理成字串,所以這裏還要使用 SPLIT 將參數 a 用逗號分割成字串陣列 |
2)步驟二:REMOVEARRAY(步驟一結果, &A1, 1)
公式 | 說明 |
---|---|
REMOVEARRAY(步驟一結果, &A1, 1) | 使用 &A1 獲取點選的分組的位置,然後在步驟一傳回的陣列中,在該位置刪除一個值,並傳回刪除後的陣列。即刪除了陣列中點選位置對應的值 |
3)步驟三:ADD2ARRAY(步驟二結果, IF(INDEXOFARRAY(SPLIT($a, ","), &A1) = 1, -1, 1), &A1)
公式 | 說明 |
---|---|
INDEXOFARRAY(SPLIT($a, ","), &A1) | 使用 &A1 獲取點選的分組的位置,傳回用逗號分割的字串陣列中的這個位置的值 |
IF() | 使用 IF 來判斷陣列的值,用 1 和 -1 達到變換順序的目的。即每次點選都將原值變為相反值 |
ADD2ARRAY() | 使用 &A1 獲取點選的分組的位置,在步驟二傳回的陣列中的該位置,插入變為相反值陣列中的所有元素,再傳回該陣列 |
4)步驟四:JOINARRAY(步驟三結果,",")
公式 | 說明 |
---|---|
JOINARRAY(步驟三結果,",") | 動態參數不能傳回陣列類型的陣列,所以需要使用陣列函式將步驟三結果轉化成一個由逗號作為分隔符的字串 |
步驟如下圖所示:
2.4 設定擴展後排序
選中 A3 儲存格,設定「擴展後排序」,選中「升冪」,輸入公式為:D3 * INDEXOFARRAY(split($a, ","), &A1)。
INDEXOFARRAY(split($a, ","), &A1) 表示使用 &A1 獲取點選的分組的位置,傳回用逗號分割的字串陣列中的這個位置的值,即為 1 或 -1。
再用 D3 儲存格的值乘以 1 或 -1,按正數升冪時,銷量欄即為「升冪」,按負數升冪時,銷量欄即為「降冪」。
步驟如下圖所示:
2.5 效果預覽
2.5.1 PC 端
儲存報表,點選「分頁預覽」,效果與 1.1 節預期效果一致。
2.5.2 行動端
App 端和 HTML5 端均支援,效果如下圖所示:
3. 範本下載
點選下載範本:分組內排序互不干擾.cpt