2012-08-02 97 views
1

我有一个包含一些财务数据的事实表。有一列(VERS_NM)定义值为“Actual”或“Current Outlook”。这两个值应该始终相同,但我们在一些报告中注意到这看起来不正确。所以我想编写一个查询来查找实际值与当前前景不匹配的位置。用于数据验证问题的SQL查询设计

我不能用我的头围绕一种方式来做到这一点。

下面是桌子的样子: table

所以回顾一下会有相同的行与行1除了VERS_NM栏会说“实际”。至少它应该是,我想找到实际和当前Outlook不匹配的任何实例。任何帮助或想法非常感谢。推动正确的方向或某种计划来解决这个问题会很好。

谢谢!

+1

这里的主要关键是什么? – stb 2012-08-02 14:57:42

回答

4

你可以只自连接的数据,将字段a, b, c, d替换为指示行等价的字段。

SELECT 
    * 
FROM 
    yourTable AS actual 
INNER JOIN 
    yourTable AS outlook 
    ON actual.a = outlook.a 
    AND actual.b = outlook.b 
    AND actual.c = outlook.c 
    AND actual.d = outlook.d 
WHERE 
     actual.VERS_NM = 'Actual' 
    AND outlook.VERS_NM = 'Current Outlook' 
    AND actual.FINC_ACCT_METRIC_VAL <> outlook.FINC_ACCT_METRIC_VAL 
+0

这看起来很有希望。我会让你知道它是如何工作的。谢谢! – tarheels058 2012-08-02 15:13:52

+0

工作就像一个魅力。再次感谢您的意见! – tarheels058 2012-08-02 16:28:03

0

你可以group by所有其他列,然后用having条款,要求每个组都有一个“实际”和“当前展望”变种:

select * 
from YourTable 
group by 
     col1 
,  col2 
,  ... all other columns ... 
having sum(case when VERS_NM = 'Actual' then 1 end) <> 1 
     or sum(case when VERS_NM = 'Current Outlook' then 1 end) <> 1 
     or count(*) <> 2 
+0

有趣的'有'条款! – stb 2012-08-02 15:02:36

+0

OP希望结果​​存在两个匹配行(一个实际的,一个Outlook),但具有不同的值。 – MatBailie 2012-08-02 15:04:50

1

另一种方法是使用UNION。它更像是一种检测许多表格字段差异的方法,但也适用于您的情况。

该技术在文章The shortest, fastest, and easiest way to compare two tables in SQL Server: UNION!中进行了描述,以比较两个单独的表格,但您可以分析一个表格。

将字段COL1,COL2等替换为您要比较的列。为了便于比较,我在内部SELECT中添加了WHERE子句,以便将您的数据有效地视为两个单独的表格。

SELECT MIN(TableName) as TableName, ID, COL1, COL2, COL3 ... 
FROM 
(
    SELECT 'Actual' as TableName, A.ID, A.COL1, A.COL2, A.COL3, ... 
    FROM Finance_Data A 
    WHERE VERS_NM = 'Actual' 
    UNION ALL 
    SELECT 'Outlook' as TableName, B.ID, B.COL1, B.COl2, B.COL3, ... 
    FROM Finance_Data B 
    WHERE VERS_NM = 'Current Outlook' 
) T 
GROUP BY ID, COL1, COL2, COL3 ... 
HAVING COUNT(*) = 1 
ORDER BY ID