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

时间:2014-03-19 07:05:56

标签: sql compare field teradata

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

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

3 个答案:

答案 0 :(得分:1)

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

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来查找不匹配的记录。

答案 1 :(得分:1)

我已经制作了两个表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

答案 2 :(得分:1)

我相信,当两个表中都存在唯一键时,以下内容将为您提供B1.ValueA1.Value的差异。我原本打算用COALESCE()写这个来计算FULL OUTER JOIN生成的缺失记录,但后来我不得不对域进行假设,以及用于{{1}的有效值是什么}}。相反,如果缺少记录,我选择显示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}; 字段没有小数精度的情况,我将其乘以1.00。否则,将返回Value的结果而不包含小数精度。

简单的Variance子句可以定位丢失的记录,没有差异的记录或具有差异的记录。