筆者曾參加過日照港物資MIS和生產(chǎn)MIS的開發(fā)工作。在實際開發(fā)過程中,利用Oracle前端開發(fā)工具之一Oracle*Reports做過許多矩陣報表。所謂矩陣報表是由一個列記錄值、一個行記錄值和一個cell組,這組內(nèi)的每一個格包含了行與列相關(guān)的數(shù)據(jù)。                                                                                            筆者認(rèn)為矩陣報表實現(xiàn)的要害在于組織數(shù)據(jù)。
  
  一、利用視圖組織矩陣報表:
  1、本例假設(shè)有一物資資金統(tǒng)計表,其格式如下:
  
  項目 類別    期初 庫存    本期 增加     本期減少    一公司    二公司     三公司    ...    期末庫存
  黑色金屬                                 
  有色金屬                                 
  五金制品                                 
  非金屬建材                                 
  橡塑                                 
  工具                                 
  勞保                                 
  雜品                                 
  機電設(shè)備                                 
  
  該表橫向顯示“期初庫存”、“本期增加”、“本期減少及消耗去向”、“期末庫存”;縱向顯示物資類別,是一矩陣報表。與該報表有關(guān)的數(shù)據(jù)基表有以下幾個:
  
  .RQ:存放統(tǒng)計日期,其數(shù)據(jù)結(jié)構(gòu)為:
  字段名    含義    長度    類型     備注
  YF    統(tǒng)計月份    6    CHAR     格式:YYYYMM
  
  .LBXX:存放物資類別信息,其數(shù)據(jù)結(jié)構(gòu)為:
  字段名    含義    長度    類型     備注
  LBDM    類別代碼    2    CHAR     取值范圍01~09
  LBMC    類別名稱    20    CHAR     
  
  .DWDM:存放領(lǐng)料單位代碼,其數(shù)據(jù)結(jié)構(gòu)為:
  字段名    含義    長度    類型     備注
  DWDM    單位代碼    4    CHAR     取值范圍0101~0199
  DWMC    單位名稱    20    CHAR     
  
  .YDKCXX:存放庫存月度備份信息,其數(shù)據(jù)結(jié)構(gòu)如下: 
  字段名    含義    長度    類型
  YDH    月份    6    CHAR
  LBDM    類別代碼    2    CHAR
  KCJE    月底庫存    12,2    NUMBER
  YRJE    月入金額    12,2    NUMBER
  YCJE    月出金額    12,2    NUMBER
  
  .XHQX:存放資金消耗去向信息,其數(shù)據(jù)結(jié)構(gòu)如下:
  字段名    含義    長度    類型     備注
  RQ    領(lǐng)料日期    10    DATE     
  WZDM    物資代碼    9    CHAR     前兩位代表物資 所屬大類
  DWDM    單位代碼    4    CHAR     
  XHJE    消耗金額    12,2    NUMBER     
  
  2、利用視圖組織矩陣報表的過程:
  
  CREATE VIEW V_ZHBB1
  AS SELECT LBDM,(KCJE-YRJE+YCJE)"QCJE" FROM YDKCXX,RQ WHERE YDH=YF;
  
  CREATE VIEW V_ZHBB2
  AS SELECT LBDM,YRJE"BQZJ" FROM YDKCXX,RQ WHERE YDH=YF;
  
  CREATE VIEW V_ZHBB3
  AS SELECT LBDM,YCJE"BQJS" FROM YDKCXX,RQ WHERE YDH=YF;
  
  CREATE VIEW V_ZHBB4
  AS SELECT LBDM,KCJE"QMJE" FROM YDKCXX,RQ WHERE YDH=YF;
  
  CREATE VIEW V_ZHBB5
  AS SELECT DWDM,SUBSTR(WZDM,1,2)"LBDM",SUM(XHJE)"LLJE" 
  FROM XHQX,RQ
  WHERE TO_CHAR(RQ,’YYYYMM’)=YF
  GROUP BY DWDM,SUBSTR(WZDM,1,2);
  
  CREATE VIEW V_ZHBB AS
  SELECT 0.1"DWDM",'期初金額'"DWMC",V_ZHBB1.LBDM,LBMC,SUM(QCJE)"JE" 
  FROM V_ZHBB1,LBXX WHERE V_ZHBB1.LBDM=LBXX.LBDM
  GROUP BY V_ZHBB1.LBDM,LBMC
  UNION
  SELECT 0.2"DWDM",'本期增加'"DWMC",V_ZHBB2.LBDM,LBMC,SUM(BQZJ)"JE" 
  FROM V_ZHBB2,LBXX WHERE V_ZHBB2.LBDM=LBXX.LBDM
  GROUP BY V_ZHBB2.LBDM,LBMC
  UNION
  SELECT 0.3"DWDM",'本期減少'"DWMC",V_ZHBB3.LBDM,LBMC,SUM(BQJS)"JE" 
  FROM V_ZHBB3,LBXX WHERE V_ZHBB3.LBDM=LBXX.LBDM
  GROUP BY V_ZHBB3.LBDM,LBMC
  UNION
  SELECT TO_NUMBER(V_ZHBB5.DWDM)"DWDM",DWMC,V_ZHBB5.LBDM,LBMC,LLJE"JE"
  FROM V_ZHBB5,DWDM,LBXX
  WHERE V_ZHBB5.DWDM=DWDM.DWDM AND V_ZHBB5.LBDM=LBXX.LBDM
  UNION
  SELECT 200"DWDM",'期末金額'"DWMC",V_ZHBB4.LBDM,LBMC,SUM(QMJE)"JE" 
  FROM V_ZHBB4,LBXX WHERE V_ZHBB4.LBDM=LBXX.LBDM
  GROUP BY V_ZHBB4.LBDM,LBMC;
  至此該矩陣報表的數(shù)據(jù)組織完畢,建立矩陣報表查詢時直接引用視圖V_ZHBB即可。
                         
  
  3、需要注重的問題:
  
  (1)    由于UNION操作當(dāng)有兩行完全相同的記錄時,只取其中的一行,這樣就造成匯總數(shù)據(jù)不準(zhǔn)確,所以設(shè)計視圖時必須避免這種情況的發(fā)生。其方法是:在同一查詢中,可加入主鍵字段加以區(qū)分;在不同查詢中,可加入一個不同值的常量來區(qū)分。
  (2)    當(dāng)所建視圖的級數(shù)或UNION次數(shù)太多時,系統(tǒng)會出現(xiàn)“打開游標(biāo)數(shù)太多”的錯誤。這時就需要用一個中間表將某一級視圖數(shù)據(jù)轉(zhuǎn)儲一下,接下來所建視圖再引用中間表的數(shù)據(jù)。
  (3)    在每次生成報表之前,必須先刪除表RQ中的原有日期,將新的統(tǒng)計日期追加進(jìn)去并提交,再刪除中間表的內(nèi)容,然后將需轉(zhuǎn)儲的視圖數(shù)據(jù)追加進(jìn)去并提交。
  2、    結(jié)論:
  利用視圖組織矩陣報表,其思路是將報表中的列利用視圖旋轉(zhuǎn)成行,然后再用并操作(UNION)將這些行連接起來。對于列值來自兩個以上的數(shù)據(jù)表或列數(shù)不確定(如上例中每月資金消耗去向)的報表,這種方法非常有效,并且在維護報表時不需要修改程序。
  以上只是一個比較簡單的例子.