一、概述
使用場景:有時使用者希望在同一張報表中,可以實現分組動態排序且互不影響的效果。
二、範例
1
資料準備。
建立普通報表,建立資料庫查詢,寫入 SQL 語句:SELECT * FROM 銷量 where 產品='蘋果汁'。如下圖所示。
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),",") 。如下圖所示。
動態參數的作用是點擊【銷量】時,能按照公式定義的規則傳回參數,再根據參數進行排序。公式說明如下表所示。
步驟 | 公式 | 公式分解 | 說明 |
步驟一 | 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】 用逗號分割成字串陣列。 | ||
步驟二 | REMOVEARRAY(步驟一結果, &A1, 1) | REMOVEARRAY(步驟一結果, &A1, 1) | 使用 【&A1】 獲取點擊的分組的位置,然後在步驟一傳回的陣列中,在該位置刪除一個值,並傳回刪除後的陣列。即刪除了陣列中點擊位置對應的值。 |
步驟三 | ADD2ARRAY(步驟二結果, IF(INDEXOFARRAY(SPLIT($a, ","), &A1) = 1, -1, 1), &A1) | INDEXOFARRAY(SPLIT($a, ","), &A1) | 使用 【&A1】 獲取點擊的分組的位置,傳回用逗號分割的字串陣列中的這個位置的值。 |
IF() | 使用 【IF】 來判斷陣列的值,用 【1】 和 【-1】 達到變換順序的目的。即每次點擊都將原值變為相反值。 | ||
ADD2ARRAY() | 使用 【&A1】 獲取點擊的分組的位置,在步驟二傳回的陣列中的該位置,插入變為相反值陣列中的所有元素,再傳回該陣列。 | ||
步驟四 | JOINARRAY(步驟三結果,",") | JOINARRAY(步驟三結果,",") | 動態參數不能傳回陣列型別的陣列,所以需要使用陣列函式將步驟三結果轉化成一個由逗號作為分隔符的字串。 |
4
設定擴展後排序。
選中 A3 儲存格,設定【擴展後排序】,選中【升冪】,輸入公式:D3 * INDEXOFARRAY(split($a, ","), &A1)。
【INDEXOFARRAY(split($a, ","), &A1) 】表示使用 【&A1】 獲取點擊的分組的位置,傳回用逗號分割的字串陣列中的這個位置的值,即為 【1】 或 【-1】。再用 D3 儲存格的值乘以 1 或 -1,按正數升冪時,銷量欄即為【升冪】,按負數升冪時,銷量欄即為【降冪】。步驟如下圖所示。
5
效果預覽。
PC 端:儲存報表,點擊【分頁預覽】,效果如下圖1所示。當點擊華東的銷量時,華東的銷量改變排序,華北的銷量不受到影響;當點擊華北的銷量時,華北的銷量改變排序,華東的銷量不受到影響。
行動端:App 端和 HTML5 端均支援,效果如下圖2所示。