簡體   English   中英

PLSQL過程比較兩個表以查看不同日期的差異

[英]PLSQL procedure compare two tables to see difference with different date

我有兩個來自不同公司的數據表。 我的主要目標是比較這兩個表,以檢查是否存在任何差異(理想情況下,所有數據都應相同)。

所以我的第一個表格格式是這樣的(只是示例)

companycode     ||  BOOK    ||    DATE                  ||  Amount  ||   
--------------------------------------------------------------------- 
 abcd           || DTCA     ||   06/02/2015 12:00:00 AM || 23679000     
 abcd           || DTCA     ||   09/02/2015 12:00:00 AM || 23679000     
 abcd           || DTCA     ||   10/02/2015 12:00:00 AM || 23679000     
 abcd           || DTCA     ||   11/02/2015 12:00:00 AM || 23679000     
 abcd           || DTCA     ||   12/02/2015 12:00:00 AM || 23679000     
 abcd           || DTCA     ||   13/02/2015 12:00:00 AM || 23679000     
 abcd           || DTCA     ||   16/02/2015 12:00:00 AM || 23679000     
 abcd           || DTCA     ||   17/02/2015 12:00:00 AM || 23679000     

---------------------------------------------------------------------

第一張表看起來像這樣,因為您只能看到日期不同。 在每個工作日都要檢查金額是否實際更改。

我的第一個查詢

select companycode, book, date, Amount from al_ext_impact_recon

第二張桌子

companycode     ||  BOOK    ||    DATE                  ||  Amount  ||   
--------------------------------------------------------------------- 
 abcd           || DTCA     ||   28/02/2015 12:00:00 AM || 23679000     
 abcd           || DTCA     ||   15/03/2015 12:00:00 AM || 24679000     
 abcd           || DTCA     ||   10/04/2015 12:00:00 AM || 25679000     
 abcd           || DTCA     ||   12/05/2015 12:00:00 AM || 26679000     
 abcd           || DTCA     ||   11/06/2015 12:00:00 AM || 27679000     
 abcd           || DTCA     ||   13/07/2015 12:00:00 AM || 28679000     
 abcd           || DTCA     ||   16/08/2015 12:00:00 AM || 29679000     
 abcd           || DTCA     ||   17/09/2015 12:00:00 AM || 30679000   

----------------------------------------------------------------------

另一方面,第二張表僅在金額更改時保留記錄。 因此,日期不一致。

第二查詢

  SELECT COALESCE (sx.a, ps.b) AS companycode,
         pc.profit_centre_mnemonic AS book,
         ps.intended_sd AS date,
         SUM (ps.projected_position + ps.actual_position) AS amount
    FROM ay ps
         INNER JOIN al_profit_centre pc
            ON ps.profit_centre_id = pc.profit_centre_id
         LEFT OUTER JOIN al_raw_stock_xref sx
            ON     ps.stock_mnemonic = sx.stock_mnemonic
               AND sx.stock_code_type = 'ISIN'
   WHERE ps.position_type IN ('P', 'X')
GROUP BY COALESCE (sx.b, ps.a), pc.profit_centre_mnemonic, ps.intended_sd
ORDER BY 1, 2, 3

所以基本上我只想檢查第二張表的日期進行比較。 並進行相交之類的操作以了解差異。 最好的方法是什么?

看這種方法。 首先,我“重新設計”了您的第一個表,因此查詢僅返回金額已更改的記錄。 我使用解析LAG函數來完成此操作。 現在這兩個表具有相同的邏輯和結構,您可以在它們上使用MINUS。

select * from onchangetable 
minus
select * from (
select companycode, book, curdate, amount from (
select companycode, book, curdate, amount,lag(amount,1,0) over (order by curdate) as amount_prev  
from alldaytable
) where amount!=amount_prev) ;

可能您需要兩種方式都做MINUS:onchangetable減去alldaytable,alldaytable數據減去onchangetable。

看看sql小提琴示例http://sqlfiddle.com/#!4/5db65/1

如果兩個示例表的時間段重疊,那將更好。 但是,如果我對您的理解正確,則表1每天(不包括周末)都有一個條目,而表2僅在金額更改時才有條目。

如果是這樣,此查詢應使表一看起來像表二:

select  companycode, Book, Min( DATE ) as Date, Amount
from    table1
group by companycode, Book, Amount;

現在使用多種方法進行比較,例如MINUS或外部聯接,以在外部字段中查找NULL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM