Matrix(矩陣)風格報表行數、列數均動態,如「物資資金消耗去向統計月報」:橫向為消耗去向(列動態),縱向為物資類別(行動態)。本文介紹利用輔助表與視圖,在數據層補齊空行空列,實現每頁固定 X 行 Y 列的定長定寬輸出。
基表 T_ZJXHQX(物資資金消耗去向):
| 字段 | 含義 | 長度 | 類型 |
|---|---|---|---|
| LBMC | 類別名稱 | 20 | CHAR |
| DWMC | 單位名稱 | 20 | CHAR |
| JE | 金額 | 14,2 | NUMBER |
T_KJL(空記錄序號表)CREATE TABLE t_kjl (no NUMBER(2));
-- 插入 Z 條記錄(Z = 每頁最大可打印行數),no 取值 1,2,3...Z
V_TJBB(核心邏輯:UNION ALL 補齊行列)CREATE VIEW v_tjbb AS
SELECT dwmc, lbmc, je FROM t_zjxhqx
UNION ALL
-- 補齊行:固定列數 Y,行數補至 X
SELECT dwmc, NULL, TO_NUMBER(NULL)
FROM t_zjxhqx, t_kjl
WHERE no - (z - x) > (SELECT MOD(COUNT(DISTINCT lbmc) - 1, x) + 1 FROM t_zjxhqx)
UNION ALL
-- 補齊列:固定行數 X,列數補至 Y
SELECT NULL, lbmc, TO_NUMBER(NULL)
FROM t_zjxhqx, t_kjl
WHERE no - (z - y) > (SELECT MOD(COUNT(DISTINCT dwmc) - 1, y) + 1 FROM t_zjxhqx);
關鍵參數:
x:每頁固定行數y:每頁固定列數z:輔助表最大序號(≥ max(x,y))啟動 Oracle Reports,建立 Matrix 風格報表,查詢直接引用視圖 V_TJBB。運行時視圖已包含補齊的空行空列,報表輸出即為固定 X 行 Y 列。
SELECT 返回實際業務數據。SELECT(補行):以輔助表 T_KJL 為駐留表,生成足夠的空行記錄(DWMC 有值,LBMC/JE 為 NULL)。SELECT(補列):同理生成空列記錄(LBMC 有值,DWMC/JE 為 NULL)。MOD(...) 計算實際行/列數對固定值取模後的缺口,動態決定補多少行/列。「輔助表 + 視圖 UNION ALL 補齊」是實現 Matrix 定長定寬的經典模式,將排版邏輯下推到 SQL 層,簡化報表開發,提高輸出穩定性。