1. 概述
1.1 應用場景
如下圖所示:當點擊華東的銷量時,華東的銷量排序,華北的銷量不受到影響。當點擊華北的銷量時,華北的銷量排序,華東的不受到影響。
1.2 實現思路
1)定義一個數組,用數組裏的元素存儲對應分組的升降序(正數爲升,負數爲降)。
2)當點擊銷量時,修改數組對應下标的值。
3)根據數組各個下标的值對各分組進行排序。
2. 示例
1)新建數據集 ds1,寫入 SQL 語句:SELECT * FROM 銷量 where 産品='蘋果汁' order by 地區,銷量
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, ","))
初始化報表時,參數 a 爲空,因此我們要根據分組的長度定義一個同等長度的數組 RANGE(COUNT(A1[!0;!0])),當點擊過一次之後,參數 a 就被賦予了值,這時我們直接取參數 a 即可,由於參數在傳遞過程中被自動處理成了字符串,所以這裏還要使用 split 來分割參數 a。
接下來是修改數組對應下标的值,由於沒有相應的公式,這裏先删除對應下标的值,然後再在對應下标添加新的值。
删除相應點擊位置對應數組下标的值:REMOVEARRAY(上一步結果, &A1, 1)
這裏使用 &A1 獲取相應點擊的分組的位置,然後從上一步結果的數組中在該位置删除一個值。
判斷原數組對應下标的值,然後添加相反值到相應點擊位置對應數組下标下:ADD2ARRAY(上一步結果, IF(INDEXOFARRAY(SPLIT($a, ","), &A1) = -1, 1, -1), &A1)
這裏使用 IF 來判斷,由於定義的數組一開始是 range(分組數量),所以判斷條件寫爲等於 -1,所以每個分組點擊第一次的時候必不成立,從而将本是正數的值變成 -1,達到變換順序的目的。
10.0動态參數不能返回數組類型的數組,需要使用到數組函數JOINARRAY(array,sepa)
4)選中 A3 單元格,設置擴展後排序,排序公式爲:D3 * INDEXOFARRAY(split($a, ","), &A1)
3. 效果預覽
1)PC端:
2)移動端:
4. 已完成模板
已完成模板可參見:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Advanced\Cacuate_Between_Cells\分組内排序互不幹擾.cpt
點擊下載模板:分組内排序互不幹擾.cpt