1

我有一个包含一些财务数据的事实表。有一列 (VERS_NM) 定义值是“实际”还是“当前 Outlook”。这两者的值应该始终相同,但我们在一些报告中注意到它似乎不正确。所以我想写一个查询来查找实际值与当前前景不匹配的地方。

我无法想办法做到这一点。

表格如下所示: 桌子

因此,回顾一下,除了 VERS_NM 列将显示“实际”之外,将有与第 1 行相同的行。至少它应该是,我想找到实际和当前 Outlook 不匹配的任何实例。非常感谢任何帮助或想法。只需朝着正确的方向推进或制定某种解决此问题的计划就可以了。

谢谢!

4

3 回答 3

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
于 2012-08-02T15:01:22.003 回答
1

另一种方法是使用UNION. 它更多地是一种检测许多表字段中差异的方法,但也可以在您的情况下工作。

在 SQL Server中比较两个表的最短、最快和最简单的方法:UNION!比较两个单独的表,但您可以分析单个表。

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

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
于 2012-08-02T15:15:07.433 回答
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
于 2012-08-02T14:59:14.087 回答