1. 程式人生 > >如何製作按段分組報表

如何製作按段分組報表

需求說明

在報表對資料進行彙總統計時,通常是按照某個欄位進行分組,比如按地區、類別等欄位分組後對其他資訊進行彙總,但有一種分組模式為不規則分組,其分組是根據資料的值段來分的,例如按照分數段、年齡段、按時間段等,屬於某個值區間的記錄歸到一個組裡如下圖所示:

1jpg

在上圖中我們可以看到,報表根據訂購日期將訂單數量和訂單金額分成四組,分別統計 "2012 年聖誕前"、“2012 年聖誕–2013 年國慶”、“2013 年國慶–2014 年五一”、"2014 年五一以後" 四個時間段的訂單。

這種按值段進行分組的分組報表被稱為按段分組,下面我們介紹一下潤乾報表中如何實現該報表。

定義資料集

ds1:SELECT 訂單. 訂購日期, 訂單明細. 數量, 訂單明細. 單價, 訂單明細. 折扣, 客戶. 地區 FROM 訂單明細, 訂單, 客戶 WHERE 客戶. 客戶 ID = 訂單. 客戶 ID AND 訂單. 訂單 ID = 訂單明細. 訂單

增加引數

報表中按時間段進行分組,實際應用中時間段通常是動態變化的,動態變化的時間段可以通過引數動態控制,所以此處增加引數進行控制:

引數名:arg1,資料型別:日期組,值表示式:2012 -12 -25, 2013 -10 -1, 2014 -5-1

引數名:arg2,資料型別:字串組,值表示式:2012 年聖誕前, 2012 年聖誕–2013 年國慶, 2013 年國慶–2014 年五一, 2014 年五一以後

arg1 引數用於控制按段分組時的日期段,arg2 用於設定報表展示時單元格的顯示資訊,稍後做詳細介紹

製作報表

報表設計模板如圖:

2jpg

A3:=ds1.group(地區; 地區:1),按照地區進行分組

B3:=ds1.count(),進行計數操作,統計訂單數量

C3:=ds1.sum( 單價數量 ),對訂單金額彙總,注意,資料庫中並沒有訂單金額欄位,訂單金額可通過單價數量計算出,潤乾中支援 sum 前先對欄位進行相應操作,並設定 C3 單元格顯示格式為:¥#0.00

B1:表示式為 =ds1.plot(訂購日期, arg1),此處使用資料集的 plot 函式(按段分組),第一個引數(訂購日期)為要分組欄位,第二個引數(arg1)為分段區間,函式主要功能是根據訂購日期欄位將資料集按照 arg1 引數指定的分段區間劃分到不同的組內,該函式返回值為整陣列,代表記錄按值段分組後組的順序,如 list(0,1,2,3) 代表第一組,第二組,第三組,第四組,具體函式說明見附註,將單元格擴充套件方向改成橫向,此時報表預覽展示效果如下:

3jpg

可以看到,B1 單元格返回的是 0,1,2,3 這種整數,所以要對其設定顯示值表示式以達到顯示效果,這裡就用到了之前定義的 arg2 引數,在 B1 單元格顯示值表示式中寫入:map(to(0,count(arg1)),arg2),map 函式主要用於顯示值表示式對映,該函式有兩個引數均為 list,由於 B1 單元格的真實值為 0,1,2 這種整數,所以 map 函式第一個引數為 0 到分段區間個數的擴充套件,第二個引數會按照順序對映返回到顯示值屬性中,這樣 B1 單元格就能按照 arg2 引數中設定好的內容進行顯示。而分段區間和顯示值均是通過引數傳遞,所以此報表的分段資訊可以通過程式控制引數達到動態效果。

根據實際要求設定報表樣式,最終效果如下:

4jpg

附註:

plot 函式說明:

根據資料值段進行分組,俗稱“按段分組”

語法:

datasetName.plot(valueExp,listExp{,filterExp})

引數:

valueExp 用於分組的值表示式

listExp 資料值段列表,同 valueExp 資料型別相同的陣列,要求其中元素從小到大排列

filterExp 過濾表示式

返回值:

整陣列,代表記錄按值段分組後組的順序,如 list(0,1,2,3) 代表第一組,第二組,第三組,第四組。因此,定義完單元格資料值表示式後還需要定義顯示值表示式,比如第一組代表不及格,第二組代表及格等等

選項:

@r 是否為根資料集表示式

@c 表示與元素比較時資料值段臨界值只包含在第 1 個碰到的區間,相同的臨界值不包含在第 2 個碰到的區間。預設資料值段臨界值只包含在第 2 個碰到的區間。

@z 表示 listExp 返回的陣列按從大到小排列; 預設為從小到大排列

示例:

例 1:ds1.plot(成績,list(60,80,90) ,科目 ==“數學”)

返回值為 list(0,1,2,3) 對資料集 ds1 過濾出科目等於數學的記錄按成績段進行分組,60 分以下不包含 60 分、60-79,80-89,90 分及 90 分以上等四組。同時定義顯示值表示式為:map(list(0,1,2,3),list(不及格, 及格, 良好, 優秀))

例 2:[email protected](成績,arg1)

其中 arg1 為引數,其資料型別是整陣列,其值為 "60,70,80,90" 。顯示值表示式為:map(to(0,count(arg1)),arg2),其中 arg2 為字串組,其值為 {“不及格”,“及格”,“中”,“良好”,“優秀”}。 本例通過引數動態控制分組值段以及結果組的顯示值。