【发布时间】:2014-03-19 07:05:55
【问题描述】:
假设我有 2 个结构相同的表,我想比较表中的数据。 如果特定字段的数据相同,那么我需要一份报告,显示 100%(匹配),否则我需要两列中数据不同的百分比。
注意:需要加入唯一键。 (假设加入键唯一且不为空)
【问题讨论】:
标签: sql compare field teradata
假设我有 2 个结构相同的表,我想比较表中的数据。 如果特定字段的数据相同,那么我需要一份报告,显示 100%(匹配),否则我需要两列中数据不同的百分比。
注意:需要加入唯一键。 (假设加入键唯一且不为空)
【问题讨论】:
标签: sql compare field teradata
将两张表相交,并将计数与其中一张表的记录总数进行比较。要找出百分比,请比较匹配计数和总计数。
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 子句可以针对缺失的记录、没有差异的记录或有差异的记录。
【讨论】: