假设我有2个具有相同结构的表,我想比较表中的数据。 如果对于特定字段的数据是相同的,那么我需要一个说100%(匹配)的报告,否则我需要两列中数据不同的百分比。
注意:需要对唯一键进行连接。 (假设加入密钥唯一且不为空)
答案 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.Value
与A1.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
子句可以定位丢失的记录,没有差异的记录或具有差异的记录。