交叉表(Cross Tabulations)是一種常用的分類匯總表格。使用交叉表查詢,顯示源于表中某個(gè)字段的匯總值,并將它們分組,其中一組列在數(shù)據(jù)表的左側(cè),另一組列在數(shù)據(jù)表的上部。行和列的交叉處可以對數(shù)據(jù)進(jìn)行多種匯總計(jì)算,如:求和、平均值、記數(shù)、最大值、最小值等。使用交叉表查詢數(shù)據(jù)非常直觀明了,被廣泛應(yīng)用。
交叉報(bào)表是報(bào)表當(dāng)中常見的類型,屬于基本的報(bào)表,是行、列方向都有分組的報(bào)表。這里牽涉到另外一個(gè)概念即分組報(bào)表。這是所有報(bào)表當(dāng)中最普通,最常見的報(bào)表類型,也是所有報(bào)表工具都支持的一種報(bào)表格式。從一般概念上來講,分組報(bào)表就是只有縱向的分組。傳統(tǒng)的分組報(bào)表制作方式是把報(bào)表劃分為條帶狀,用戶根據(jù)一個(gè)數(shù)據(jù)綁定向?qū)е付ǚ纸M,匯總字段,生成標(biāo)準(zhǔn)的分組報(bào)表。
例如下圖是典型的分組交叉表格是一份銷售人員銷售情況的匯總表,其中垂直方向是對銷售收入來源進(jìn)行的分組(包括銷售地區(qū)、客戶信息), 而水平方向中則是對銷售收入和平均價(jià)格進(jìn)行匯總。此匯總表復(fù)雜百出,涉及到縱向分組,又涉及到橫向求和。

接下來看用Style Report 這款java報(bào)表工具如何實(shí)現(xiàn)此表的制作,過程步驟比較多,請耐心閱讀:
1. 打開報(bào)表設(shè)計(jì)器,在工具欄中選擇“新建”。 在“新建資源”對話框中,選擇“空白表格式報(bào)表”。
2. 在報(bào)表的空白處點(diǎn)擊右鍵菜單,選擇“腳本”選項(xiàng),然后打開報(bào)表腳本編輯窗口。
3. 在報(bào)表腳本編輯窗口的“裝載”標(biāo)簽下輸出腳本:
var q1 = runQuery('customers');
var q2 = runQuery('Order details');
以上腳本是將兩個(gè)報(bào)表數(shù)據(jù)查詢('customers' 和 'Order details')中的數(shù)據(jù)存放在q1,q2兩個(gè)變量中。
4. 關(guān)閉報(bào)表腳本編輯窗口,在右側(cè)的工具箱中選擇”表格“組件,放入報(bào)表中。
5. 點(diǎn)擊表格,打開右鍵菜單,在右鍵菜單中選擇”表格->轉(zhuǎn)換為公式表“。

6. 點(diǎn)擊表格,打開右鍵菜單,在右鍵菜單中選擇”屬性”,打開表格屬性窗口,選擇“標(biāo)題和結(jié)尾”標(biāo)簽,在表格行中輸入“6”,在表格列中輸入“4”,標(biāo)題行為“0”。

下面的步驟中進(jìn)行垂直方向上的數(shù)據(jù)分組設(shè)定,數(shù)據(jù)分組為兩層分組,分別是地區(qū)和客戶。
7. 點(diǎn)擊表格中cell[2,0]單元格(第三行,第一列),在下方的表格屬性窗口中選擇“數(shù)據(jù)“標(biāo)簽,然后在公式輸入框中輸入以下腳本:
toList(q1['state']);
q1['state']是提取“customers”數(shù)據(jù)查詢中的“state"列的數(shù)據(jù),toList 函數(shù)的作用是獲取q1['state']中沒有重復(fù)記錄的所有數(shù)據(jù)。

8. 在屬性窗口,選擇”擴(kuò)展單元格“和”垂直“方向的擴(kuò)展。這個(gè)設(shè)置的作用是將表格單元格按照真實(shí)的數(shù)據(jù)列進(jìn)行擴(kuò)展。
9. 設(shè)置表格單元格的名稱為"st",然后點(diǎn)擊”應(yīng)用“按鈕。

10. 按住”Shift“鍵同時(shí)選中 cell[3,0]和 cell[4,0]兩個(gè)表格單元格,然后打開右鍵菜單,在右鍵菜單中選擇”表格->合并單元格“。
11. 在下方的屬性窗口中選擇“數(shù)據(jù)“標(biāo)簽”,然后在公式輸入框中輸入以下腳本:
toList(q1['company_name@state:$st']);
q1['company_name@state:$st']是提取“customers”數(shù)據(jù)查詢中的“company_name"列的數(shù)據(jù)結(jié)果,并且”company_name“將根據(jù)對應(yīng)的”state“列進(jìn)行分組。
12. 在屬性窗口,選擇”擴(kuò)展單元格“和”垂直“方向的擴(kuò)展,設(shè)置單元格的名稱為"comp",在行分組中選中”st“,然后點(diǎn)擊”應(yīng)用“按鈕。

通過以上的步驟,垂直方向上的兩層分組(第一層:state,第二層:company_name)就被建立完成了
13. 按住”Shift“鍵同時(shí)選中 cell[0,3]和 cell[1,3]兩個(gè)表格單元格,然后打開右鍵菜單,在右鍵菜單中選擇”表格->合并單元格“。
給對應(yīng)的表頭加上對應(yīng)的文字。
Cell[0,1] = '數(shù)量合計(jì)'
Cell[0,2] = '毛利額'
Cell[1,1] = '平均單價(jià)'
Cell[1,2] = '折扣金額'
Cell[5,0] = '銷售合計(jì)'
Merged Cell[0,3] = '凈收入'

14. 創(chuàng)建合計(jì)列,合計(jì)列是指定數(shù)據(jù)列的聚合,合計(jì)列被加入到最低層的分組上。加入下面的公式到對應(yīng)的表格單元格中。
在 Cell[3,1]單元格中插入:
sum(q2['Quantity@Company:$comp']);
在 Cell[4,1]單元格中插入:
average(q2['Price@Company:$comp']);
在 Cell[3,2]單元格中插入:
sum(q2['Total@Company:$comp']);
在 Cell[4,2]單元格中插入:
sum(q2['=Total*Discount@Company:$comp']);
設(shè)置Cell[3,2]表格單元格的名稱為:"grossRevenue"
設(shè)置Cell[4,2]表格單元格的名稱為:"discountRevenue"
15. 創(chuàng)建凈收入數(shù)據(jù)列,"凈收入=總收入-折扣金額"。首先合并表格單元格,按住”Shift“鍵同時(shí)選中 cell[3,3]和 cell[4,3]兩個(gè)表格單元格,然后打開右鍵菜單,在右鍵菜單中選擇”表格->合并單元格“。然后在合并的表格單元格輸入以下腳本:
$grossRevenue-$discountRevenue;
16. 設(shè)置合并的表格單元格的名稱為”netRevenue“ ,凈收入為每個(gè)地區(qū)中客戶的凈收入。
17. 設(shè)置Cell[2,3]表格單元格的腳本為:
sum($netRevenue);
此凈收入為每個(gè)地區(qū)的合計(jì)
18. 設(shè)置Cell[5,3]表格單元格的腳本為:
sum($netRevenue);
此凈收入為所有地區(qū)的總計(jì)

最后依照最初的表格,在各表格單元格中設(shè)置字體格式、數(shù)字格式等。點(diǎn)擊Preview即可得到此表:
