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

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

6. 點擊表格,打開右鍵菜單,在右鍵菜單中選擇”屬性”,打開表格屬性窗口,選擇“標題和結尾”標簽,在表格行中輸入“6”,在表格列中輸入“4”,標題行為“0”。

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

8. 在屬性窗口,選擇”擴展單元格“和”垂直“方向的擴展。這個設置的作用是將表格單元格按照真實的數據列進行擴展。
9. 設置表格單元格的名稱為"st",然后點擊”應用“按鈕。

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

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

14. 創建合計列,合計列是指定數據列的聚合,合計列被加入到最低層的分組上。加入下面的公式到對應的表格單元格中。
在 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']);
設置Cell[3,2]表格單元格的名稱為:"grossRevenue"
設置Cell[4,2]表格單元格的名稱為:"discountRevenue"
15. 創建凈收入數據列,"凈收入=總收入-折扣金額"。首先合并表格單元格,按住”Shift“鍵同時選中 cell[3,3]和 cell[4,3]兩個表格單元格,然后打開右鍵菜單,在右鍵菜單中選擇”表格->合并單元格“。然后在合并的表格單元格輸入以下腳本:
$grossRevenue-$discountRevenue;
16. 設置合并的表格單元格的名稱為”netRevenue“ ,凈收入為每個地區中客戶的凈收入。
17. 設置Cell[2,3]表格單元格的腳本為:
sum($netRevenue);
此凈收入為每個地區的合計
18. 設置Cell[5,3]表格單元格的腳本為:
sum($netRevenue);
此凈收入為所有地區的總計

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