我想创建一个控件,用于验证每个视图中三个公司内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