比较teradata表字段并返回字段匹配或不同的百分比



假设我有两个具有相同结构的表,并且我想比较表中的数据。如果对于一个特定的字段,数据是相同的,那么我需要一个报告,将说100%(匹配),否则我需要百分比的数据是不同的,在两列。

注意:需要对唯一键进行连接。(假设连接键唯一且不为空)

将两个表相交,并将计数与任何一个表的记录总数进行比较。要找出百分比,请比较匹配计数和总计数。

SELECT 'Matching', COUNT(*) FROM (
SELECT COLUMN_1 FROM TABLE_1
INTERSECT
SELECT COLUMN_1 FROM TABLE_2 )
UNION ALL
SELECT 'Table_1', COUNT(*) FROM TABLE_1
UNION ALL
SELECT 'Table_2', COUNT(*) FROM TABLE_2

假设Table_1有20条记录,Table_2有25条记录,并且有10个匹配值。当你做相交时,你会得到10。

您也可以尝试使用MINUS代替INTERSECT来查找不匹配的记录

我假设有两个表Table1和Table2,我们使用Table1作为参考表。下面是查询

SELECT
A.CNT as diff_number ,B.CNT as actual number
FROM
(SELECT COUNT(*) as cnt FROM
(SELECT * FROM TABLE1
MINUS
SELECT * FROM TABLE2) A1
UNION ALL
(SELECT * FROM TABLE2
MINUS
SELECT * FROM TABLE1) A2 ) A
CROSS JOIN
(SELECT COUNT(*) AS CNT1 FROM TABLE1) B

我相信,当两个表中都存在唯一键时,下面的代码将为您提供B1.Value相对于A1.Value的差异。我最初打算用COALESCE()来写这个,以解释FULL OUTER JOIN产生的缺失记录,但后来我不得不对域做出假设,以及NULL使用的有效值是什么。相反,我选择在缺少记录时只显示NULL。

SELECT CASE WHEN A1.Value IS NULL OR B1.Value IS NULL
            THEN NULL
            WHEN A1.Value = B1.Value
            THEN 1
            ELSE ((A1.Value - B1.Value) / (A1.Value * 1.000)
       END AS Variance      
  FROM TableA A1
  FULL OUTER JOIN
       TableB B1
    ON A1.{UniqueKey} = B1.{UniqueKey};

注意:为了解释Value字段没有十进制精度的情况,我将其乘以1.00。否则,返回Variance的结果将没有十进制精度。

一个简单的WHERE子句可以针对缺失的记录,没有差异的记录,或者有差异的记录。

最新更新