第七章 BIRT分組報表

7.1 分組的建立,插入,刪除

我們先構建報表,空白模板,示例數據庫和sql查詢數據源,數據集setOrders,如下

select

CLASSICMODELS.CUSTOMERS.CUSTOMERNAME,

CLASSICMODELS.ORDERS.ORDERNUMBER,

CLASSICMODELS.ORDERS.ORDERDATE,

CLASSICMODELS.ORDERS.STATUS,

CLASSICMODELS.ORDERDETAILS.QUANTITYORDERED,

CLASSICMODELS.ORDERDETAILS.PRICEEACH

from

CLASSICMODELS.CUSTOMERS,

CLASSICMODELS.ORDERS,

CLASSICMODELS.ORDERDETAILS

where

CLASSICMODELS.CUSTOMERS.CUSTOMERNUMBER = CLASSICMODELS.ORDERS.CUSTOMERNUMBER

and

CLASSICMODELS.ORDERS.ORDERNUMBER = CLASSICMODELS.ORDERDETAILS.ORDERNUMBER

我們要先以客戶名稱分組,再以訂單號分組:


那麼我們在佈局好了普通網格報表之後,在詳細行上右擊,選擇插入分組

首先插入分組grpCustomerName,分組依據CUSTOMERNAME,目錄的項目表達式爲:row["CUSTOMERNAME"] + ": $(" + row["CUSTOMERTOTAL"].toFixed(2) + ")USD"


3. 設置分組的屬性:

� 輸入該分組的名稱,該名稱唯一標識該組,而且該名稱會出現在右鍵菜單“編輯組”當中,您可以非常方便的編輯指定的組。

� 選擇分組依據。在下拉框中給您列出了當前表所綁定的所有列,這些列可以不在表中顯示。選擇數據集上的可用列作爲一個分組或者用表達式生成器去構建一個數據綁定作爲分組依據

� 設置分組間隔。您可以設置一種分組間隔類型,然後指定分組間隔值。關於如何設置間隔,請參考後面小節“按間隔分組數據”。

� 設置是否要隱藏詳細信息。您可以選中該複選框來隱藏表格當中的明細信息,從而只顯示組頭或組尾的彙總數據。

� 設置目錄的項目表達式。項目表達式:指定目錄的標題的表達式,可以選擇數據集上的可用列作爲一個分組或者用表達式生成器去構建一個數據綁定作爲分組依據,樣式用來指定標題的樣式

� 設置排序方向。選擇數據分組後,各組按升序還是降序排列。

� 設置分頁。您可以設置報表在什麼位置分頁。如果您想讓每組數據都在單獨的頁面上顯示,那麼您可以在組之前或之後設置一下分頁。

� 設置篩選。您可以添加一個或多個篩選對組中的數據進行篩選。

� 設置排序。您可以設置組內數據的排序。


排序方向:用於指定分組的排序

換頁:用於指定換頁之後是否重複標題

排序與過濾:用於指定排序的依據和過濾的依據

我們再插入分組grpOrderNumber,分組依據ORDERNUMBER,目錄的項目表達式爲:"Order Number: " + row["ORDERNUMBER"] + "\n$(" + row["ORDERTOTAL"].toFixed(2) + ")USD"


做適當的佈局:


其中:

TOTALSALE綁定:dataSetRow["QUANTITYORDERED"] * dataSetRow["PRICEEACH"]

ORDERTOTAL綁定:Total.sum(row["TOTALSALE"])

CUSTOMERTOTAL綁定:Total.sum(row["TOTALSALE"])

做適當的頁面美化,我們就能看到這樣的預覽效果


7.2 分組的排序與過濾

如果沒有添加排序依據,那麼就依據默認的排序單選進行排序


如果添加有排序依據,則會覆蓋默認的排序依據:


其中,分組的鍵可以用分組依據,也可以用表達式生成器構建;

方向可以是升序或是降序;

語言環境選自動即可;

排序依據必須是和分組依據一一關聯的,不能是多對一,比如本分組不能使用row["ORDERDATE"],否則排序依據失效;

有多個排序依據時則依照sql的排序依據順序執行;

過濾器: 


其中篩選條件中的表達式生成器可以是分組的字段,也可以是表達式生成器生成的

注意的是過濾依據必須是和分組依據一一關聯的,不能是多對一,比如本分組不能使用row["ORDERDATE"],否則過濾依據失效;

這樣我們就篩選出銷售額前3名的客戶分組。

我們還可以構建多個篩選條件。

7.3 分組的間隔,聚合,可視性,映射,突出顯示,書籤

    當您創建分組時,BIRT報表默認是按每個分組依據值來分組數據的,比如一個客戶名,一個國家名,或者一個日期。在前面我們創建的客戶信息表中,BIRT報表將每個國家作爲一組,在每組下面列出這個國家所有客戶信息。有時按指定的間隔來分組數據更加有用。比如說一張銷售報表可以按季度來分組銷售數據,而不是按照詳細的日期分組。同樣您也可以按周或月來分組發貨報表,而非按照詳細的日期。

比較下面兩張報表,第一張將訂單信息按詳細的日期分組,而第二張報表則按月份來分組訂單信息。



通過上面兩張報表您可以看到,有些時候設置分組間隔能夠更好的組織數據,更加便於用戶查看:

� 設置分組間隔可以將很長的報表分隔成爲許多短小的,更便於閱讀的“塊”。

� 設置分組間隔可以對該間隔期的數據進行彙總,更便於分析。

下面給您更加詳細的介紹如何設置分組依據爲字符串、數值與時間日期的分組間隔

設置字符串的分組間隔

當您設置分組字符串數據的分組間隔時,該分組間隔是一個特定長度的字符串前綴。比如將客戶信息按客戶名分組,您可以按照客戶名的第一個字母,前兩個字母等來分組。

一般情況下,報表在顯示名字/名稱列表時,會按名字/名稱的第一個字母來分組。比如一張客戶信息表,我們會將客戶信息按它們名稱的第一個字母來分組,名稱以A 開頭的客戶分爲一組,以B 開頭的客戶分爲一組,以此類推。您還可以設置多個字母間隔來對字符串分組,來將那些名稱裏面包含多個特定字母的前綴按這個前綴分組。比如一個產品名稱中,可能開頭兩個字母表示供應商,如ME, MO 等,那麼我們就可以按前兩個字母前綴來對產品名稱分組。下面就是我們按一個字母前綴、兩個字母前綴、三個字母前綴來對客戶名稱分組的例子。


設置字符串分組間隔

1. 首先按前面小節中介紹的步驟來創建分組,分組依據爲字符串類型。

2. 在間隔中設置“前綴”,

3. 在“區域”中設置需要按前幾個字符作爲前綴來對字符串分組。

我們建立數據集customer:

select CLASSICMODELS.CUSTOMERS.CUSTOMERNAME,CLASSICMODELS.CUSTOMERS.CONTACTLASTNAME,CLASSICMODELS.CUSTOMERS.PHONE,CLASSICMODELS.CUSTOMERS.ADDRESSLINE1,CLASSICMODELS.CUSTOMERS.CITY,CLASSICMODELS.CUSTOMERS.STATE,CLASSICMODELS.CUSTOMERS.COUNTRY,CLASSICMODELS.CUSTOMERS.CREDITLIMIT

from CLASSICMODELS.CUSTOMERS




當您對數值數據分組時,您也可以設置分組間隔。比如您製作訂單信息表時,當訂單號爲數值型時,可以按訂單號每50 個、100 個、1000 個等來分組。

在設置數值數據的分組間隔時,您需要考慮該數值的範圍來設定這個間隔。如果數值的範圍從100 至200,那麼分組間隔可以設置爲10;如果數值範圍從100 至1000 時,那麼分組間隔可以設置爲100。

下圖給您顯示了數值數據按 10、100 和1000 間隔來分組的例子:


在您設置了數值數據的分組間隔後,BIRT報表是按照數據返回的第一個值來計算並分組的。比如第一個數值是1070,如果您設置的分組間隔是10,那麼第一組數據則是1070-1079,第二組數據是1080 至1089,以此類推。在上圖的例子中當分組間隔爲1000 時,您可以看到2005 和2030 也被分在了第一組中,因爲您數值的第一個值是1070。在很多情況下這可能不是您想要的結果。

前面說到,BIRT報表是按照返回數據的第一個值作爲基準值來計算並分組的。當然您可以設置這個基準值。您可以在分組時設置分組間隔的基數,讓BIRT報表用您設置的值來作爲基數來計算分組。下圖就是設置分組間隔基數與否的區別:


設置數值數據的分組間隔

1. 按照前面小節的步驟創建分組。

2. 在間隔中選擇“間隔”對數值設置分組間隔。

3. 在區域中設置分組間隔數值,如10,100 等。

4. 如果您需要指定分組間隔的基數,那麼選中“對間隔使用固定基值”複選框,並在下面的輸入框中輸入該基值。


5. 點擊“確定”,預覽報表結果。下圖就是我們對訂單信息表按照訂單號來分組,並將分組間隔設置爲10 的結果:


當您設置日期時間數據的分組間隔時,您可以把日期以小時、天、周、月、年爲間隔進行分組。設置日期時間數據的分組間隔對於按時間顯示的信息來說非常有幫助,比如我們常見的日報、週報、月報、季度報、年報等。

下圖給您展示了按日期分組,分別以周、月、季度爲分組間隔的報表。每週從週一開始,每月從當月的第一天開始,季度分別從1 月1 日至1 月31 日,4 月1 日至6 月30 日,7月1 日至9 月30 日,10 月1 日至12 月31 日。如果您以年爲分組間隔,則從一年的1 月1 日至當年的12 月31 日爲一組。


如果您不想使用BIRT報表日期時間數據的默認分組間隔,您可以指定自己的分組基值與間隔區域。比如一個企業的財年是從10 月1 日至次年的9 月30 日,那麼您在統計近10 年該企業的財務年報時,則可以基於自己的年報起止日期來設定分組,而非使用日曆意義上的年報設置。比如您可以設置分組基值爲1999 年10 月1 日,分組間隔爲年,那麼BIRT報表就會將1999 年10 月1 日至2000 年9 月30 日分爲第一組,2000 年10 月1 日至2001 年9 月30 日爲第二組,以此類推。

設置日期時間的分組間隔

1. 按照前面小節介紹的步驟創建分組,分組依據爲日期時間類型。

2. 選擇分組間隔,您可以選擇秒、分鐘、小時、天、周、月、季度和年。

3. 在“區域”中設置一個數值,指定每多少間隔作爲一組。比如您選擇分組間隔爲周,區域數值設置爲2,那麼BIRT報表就會每2 周的數據作爲一組。

4. 如果您需要設置分組的基值,那麼選中“對間隔使用固定基值”,並在下面輸入區域中設置基值。


5. 點擊“確定”,預覽報表結果。下圖是對客戶訂單信息按日期分組,並設置分組間隔爲月的結果。


許多報表一個比較普遍的特性就是需要顯示一些彙總或聚合信息。比如一張銷售報表需要顯示銷售總額:按產品的銷售額,按地區的銷售額等;平均銷售額;最高或最低銷售額。而前面章節我們已經創建了一些簡單的帶有彙總信息的報表,比如按國家分組並帶有客戶數量彙總的客戶信息表,按日期分組並帶有訂單數量彙總的訂單信息表。彙總信息通常是對某些數據行中的數據進行計算的結果。對於一個簡單列表型的報表,聚合計算是作用在整個報表的數據行上的。比如下圖這張客戶信息表就在最後加入了一個對客戶數量的總計。


在上面的例子中,BIRT報表通過對報表中所有客戶名稱的計數來統計客戶數量。除了可以對報表中所有數據進行彙總外,您還可以對每個分組的數據進行彙總。比如下面這個例子:


上面例子中的報表將客戶信息按國家分了組,除了對所有客戶數量進行彙總意外,還對每個組內的客戶數量進行了彙總。

BIRT報表中的彙總是通過聚合計算來實現的,而BIRT報表提供了類型豐富的聚合計算函數,最常用的有AVE(), COUNT(), COUNTDISTINCT(), SUM()等。您可以查閱BIRT報表幫助文檔來獲取這些函數的信息。

一般情況下,我們會在表格的表頁眉行、表頁腳行,以及組頁眉行、組頁腳行放置聚合數據。當然您也可以在明細行放置聚合數據,但是一般情況下我們不會放置前面提到的那些常用函數,如AVG(),COUNT(),SUM()等,因爲同一分組內各明細行的聚合數據都是重複的。一般我們在明細行會放置runningSUM(),movingAVG()等聚合函數,這樣會比較有意義,因爲這些函數只對當前明細行以前的數據進行聚合。下面我們就來創建一張客戶訂單詳情表,它按客戶來統計每個客戶的訂單信息。表中既有SUM()又有runningSUM()聚合,其中累計訂購額爲runningSUM()計算而得,而每個訂單的訂購額與客戶的訂購額則由SUM()計算而得。


您可以按以下步驟來顯示上面例子的聚合數據:

1.首先您先設計出一張列表型報表,其中包括客戶名稱,訂單號,產品編號,訂購數量,訂購單價與訂購金額。其SQL 查詢語句如下:

select c.customerName,o.orderNumber,productCode,quantityOrdered,priceEach,

(quantityOrdered*priceEach) as orderPrice from customers as c, orders as o, orderdetails as od where c.customerNumber = o.customerNumber and o.orderNumber=od.orderNumber

該報表運行結果如下圖所示:


2. 在表格最右邊添加一列,將表頭設置爲“累計訂購額”。

3. 選中表格中的明細數據行,按“客戶名稱”對數據進行分組gCustomer,然後再選中明細數據行,再按“訂單編號”進行分組gOrderNumber。此時報表設計文件應該如下圖所示:


4. 在明細數據行,累計訂購額列,從Palette 拖入一個聚合元素。


5. 在彈出的“聚合生成器”窗口中,輸入名稱,設置數據類型爲浮點,選擇函數爲RUNNINGSUM,表達式爲row[“ORDERPRICE”],聚合條件爲組gOrderNumber。這樣BIRT報表在生成每一行明細數據時,會對截至當前數據行且同一訂單號分組下的訂購額進行彙總。


6. 在訂單號分組與客戶分組的組頁腳中分別添加一個聚合,數據類型爲浮點,聚合函數爲SUM,表達式爲row[“ORDERPRICE”],聚合條件分別爲組gOrderNumber 與組gCustomer。BIRT報表將會在每個訂單組與客戶組後面加上該組的訂單額總計。

7. 在表頁腳添加一個聚合,數據類型爲浮點,聚合函數爲SUM,表達式爲row[“ORDERPRICE”],聚合條件爲表。BIRT報表將會在報表最後加上所有訂單額的總計。

8. 調整報表外觀格式,此時報表設計如下圖所示:


9. 預覽報表結果,觀察RUNNINGSUM 與SUM 的區別。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章