使用full outer join 分析,校驗數據

2770阅读 0评论2015-04-28 gangjh
分类:Oracle

   在erp系統中, 當使用者輸入一筆單據, 經常會需要處理到很多不同的Table.
  如一筆收貨數據,會回饋採購檔已收貨量,入收貨檔,入庫存檔,庫存累計檔.等等.

各個帳目間的數據是否一致?
   1.用量檔中已採購量總量和多次採購累計,
   2.已同一採購單的多次收貨量和該單的已收量.
   3.當日收貨和當日庫存量是否一致.
   4.收貨量和付款量數據
   5.出庫量和派工量.
   6.是否有程序bug,資料寫入部份寫入錯誤.
   ......

   可用匯總比較兩邊數據是否一致作為一種校驗手段.
   這時候用left join或right join就不合適了, 可能會存在左邊有,右邊沒有, 或左邊沒有右邊有的情況.
   需要用到full outer join 來關聯.

場景1. 庫存檔的主檔和出入庫明細按料號匯總比校.
有差異就表示數據出現問了.需要請赶緊分析問題,修正bug, 調整數據.

点击(此处)折叠或打开

  1. with aa as (
  2. SELECT fact_no, SUBSTR(check_date,1,6) "YYMM", mat_no,
  3.            NVL(SUM(check_qty),0) + NVL(SUM(overtop_qty),0) in_qty,
  4.            NVL(SUM(shoot_qty),0) shoot_qty
  5.     FROM y3_matkinm
  6.     WHERE check_date >=to_char(sysdate-7,'YYYYMM')
  7.     GROUP BY fact_no, SUBSTR(check_date,1,6), mat_no
  8.   ) ,
  9. bb AS (
  10.     SELECT fact_no, yymm, mat_no,
  11.            SUM(NVL(in_stock,0)) in_stock,
  12.            SUM(NVL(out_stock,0)) out_stock
  13.     FROM y3_ymkstock
  14.     WHERE yymm >=to_char(sysdate-7,'YYYYMM')
  15.     GROUP BY fact_no, yymm, mat_no
  16. )

  17. SELECT yymm, fact_no, mat_no,
  18.         aa.in_qty, bb.in_stock, NVL(aa.in_qty,0) - NVL(bb.in_stock,0) in_cy,
  19.         aa.shoot_qty, bb.out_stock, NVL(aa.shoot_qty,0) - NVL(bb.out_stock,0) out_cy
  20.     FROM aa
  21.     FULL OUTER JOIN bb
  22.     USING ( fact_no, yymm, mat_no )
  23.  WHERE ( NVL(aa.in_qty, 0) <> NVL(bb.in_stock,0) OR NVL(aa.shoot_qty, 0) <> NVL(bb.out_stock,0))

阿飛
2015/04/29

上一篇:Oracle SQL使用經驗 && Oracle 用left join 更新數據
下一篇:使用over partition分析企業erp數據,lead使用範例