找出2个相似表格之间的差异(计数差异)

时间:2018-12-21 11:15:41

标签: sql sql-server tsql

我有两个相似的表,一个是每月更新的实时表,另一个是相同的数据,但有一个snapshot表,如下图所示。特别是,还有一个名为Live_History_Month的附加列来确定数据输入的month_year。

我试图查看特定列的计数是否有任何变化,所以我可以进一步调查。 我创建了以下SQL代码

select codetoinvestigate
,Year_Month
,count(*)
from tbl1
where Live_History_Month = Year_Month
group by codetoinvestigate
,Year_Month


select codetoinvestigate
,Year_Month
,count(*)
from tbl2
group by codetoinvestigate
,Year_Month

现在如何链接这些对象,以便可以查看指定列的计数之间是否存在任何差异,从而可以做出需要调查的明智决定。

只需确认tbl1是快照表,tbl2是具有最新数据的表即可。

谢谢

5 个答案:

答案 0 :(得分:1)

这将返回不同的计数和缺少的代码

with t1 as
 (
    select codetoinvestigate
    ,Year_Month
    ,count(*) as cnt
    from tbl1
    where Live_History_Month = Year_Month
    group by codetoinvestigate
    ,Year_Month
 ),
t2 as
 (
    select codetoinvestigate
    ,Year_Month
    ,count(*) as cnt
    from tbl2
    group by codetoinvestigate
    ,Year_Month
 )

select coalesce(t1.codetoinvestigate,  t2.codetoinvestigate)
   ,coalesce(t1.Year_Month, t2.Year_Month)
   ,t1.cnt
   ,t2.cnt
   ,case when t1.codetoinvestigate is null 
           then 'missing code t1'
          when t2.codetoinvestigate is null 
            then 'missing code t2'
          when t1.cnt <> t2.cnt 
            then 'count different'
        etc...
    end
from t1 full join t2
  on t1.codetoinvestigate = t2.codetoinvestigate
 and t1.Year_Month = t2.Year_Month
 and t1.cnt <> t2.cnt

要仅检查不同的计数,请切换到内部联接

答案 1 :(得分:0)

您可以使用UNION ALL

select t1.codetoinvestigate, t1.Year_Month, count(*) cnt, 'tbl1' as table_name
from tbl1 t1
where t1.Live_History_Month = Year_Month
group by t1.codetoinvestigate, t1.Year_Month
union all
select t2.codetoinvestigate, t2.Year_Month, count(*), 'tbl2' 
from tbl2 t2
group by t2.codetoinvestigate, t2.Year_Month;

通过这种方式,您可以过滤出表名以获取差异。

答案 2 :(得分:0)

您可以尝试使用联接两个表

select A.codetoinvestigate,A.Year_Month, A.cnt1, B.cnt2 from 
    (
    select codetoinvestigate
    ,Year_Month
    ,count(*) as cnt1
    from tbl1
    where Live_History_Month = Year_Month
    group by codetoinvestigate
    ,Year_Month
    ) A inner join 
    (
    select codetoinvestigate
    ,Year_Month
    ,count(*) cnt2
    from tbl2
    group by codetoinvestigate
    ,Year_Month
    )B on A.codetoinvestigate=B.codetoinvestigate and A.Year_Month=B.Year_Month

答案 3 :(得分:0)

如果您只想查看更改,那为什么不做减号?

select codetoinvestigate
,Year_Month
,count(*)
from tbl1
where Live_History_Month = Year_Month
group by codetoinvestigate
,Year_Month

minus

select codetoinvestigate
,Year_Month
,count(*)
from tbl2
group by codetoinvestigate
,Year_Month

然后,您只获得发生更改的行

答案 4 :(得分:0)

在SQL Server 2012或更高版本上?试试:

select      codetoinvestigate
            ,Year_Month
            ,count(*)
from        tbl2
group by    codetoinvestigate
            ,Year_Month

EXCEPT 

select      codetoinvestigate
            ,Year_Month
            ,count(*)
from        tbl1
where       Live_History_Month = Year_Month
group by    codetoinvestigate
            ,Year_Month

这将返回在快照表(tbl1)中发现的与您当前最新数据(tbl2)不匹配的差异。