[英]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.