在12个不同的视图中交叉验证总和

时间:2017-08-17 09:27:48

标签: sql sql-server database

我想创建一个控件,用于验证每个视图中三个公司内12个不同视图之间的数字总和是否相同。

有时出现问题,一两家公司的两个或两个以上的观点总和略有不同。

现在,我正在研究一个非常长的SQL,因为我正在计算表A的总和,并加入表B中的总和并选择那些存在差异的公司。然后我从一个新的SQL中创建一个UNION ALL,我将表A中的总和与表C中的总和进行比较。因为我有12个不同的视图,所有这些都必须相互比较,所以SQL就这样了很长,错误的风险也会增加。

有没有一种聪明且更好的方法可以解决这个问题,我不需要在所有可能的组合中手动交叉比较所有12个视图?

当然可以。当我谈论差异时,我不是在谈论小数点后三位的小差异。这可能是数千甚至数千万,因为有人在主程序中产生了一个事务错误,该错误会输入到表中。

在下面的代码中,我将TableA中的总和与TableB和TableC中的总和进行比较。如果我手动必须在12个不同的视图之间添加所有可能的比较,代码将最终非常长,我想尽可能避免这种情况。

> SELECT  a.Companyid ,
>         ( a.[View] + ' vs. ' + b.[View] ) AS Views ,
>         ( a.[Mv.Facts.TableA] - b.[Mv.Facts.TableB] ) AS Difference FROM    ( SELECT    Companyid ,
>                     'Facts.TableA' AS [View] ,
>                     SUM(MV) AS [Mv.Facts.TableA]
>           FROM      TABLE a
>           WHERE     Companyid IN ( 3, 5, 36 )
>           GROUP BY  Companyid ,
>         ) a
>         LEFT OUTER JOIN ( SELECT    Companyid ,
>                                     'Facts.TableB' AS [View] ,
>                                     SUM(Mv) AS [Mv.Facts.TableB]
>                           FROM      TABLE B
>                           WHERE     Companyid IN ( 3, 5, 36 )
>                           GROUP BY  Companyid) b ON a.Companyid = b.Companyid WHERE   ROUND(( a.[Mv.Facts.TableA] - b.[Mv.Facts.TableB]
> ), 0) <> 0
> 
> 
> UNION ALL SELECT  Companyid ,
>         ( a.[View] + ' vs. ' + c.[View] ) AS Views ,
>         ( a.[Mv.Facts.TableA] - c.[Mv.Facts.TableC] ) AS Difference FROM    ( SELECT    Companyid ,
>                     'Facts.TableA' AS [View] ,
>                     SUM(Mv) AS [Mv.Facts.TableA]
>           FROM      TABLE a
>           WHERE     Companyid IN ( 3, 5, 36 )
>           GROUP BY  Companyid ) a LEFT OUTER JOIN (SELECT             Companyid ,
>                     'Facts.TableC' AS [View] ,
>                     SUM(Mv) AS [Mv.Facts.TableC]
>           FROM      TABLE C
>           WHERE     Companyid IN ( 3, 5, 36 )
>           GROUP BY  Companyid) c ON a.Companyid = c.Companyid WHERE ROUND((a.[Mv.Facts.TableA] - c.[Mv.Facts.TableC]),0) <> 0

0 个答案:

没有答案