数据验证问题的SQL查询设计

数据验证问题的SQL查询设计,sql,sql-server,teradata,Sql,Sql Server,Teradata,我有一个事实表,其中包含一些财务数据。有一列(VERS_NM)定义值是“实际”还是“当前Outlook”。这两个值应该总是相同的,但我们注意到在一些报告中它似乎不正确。因此,我想编写一个查询,查找实际值与当前outlook不匹配的地方 我不知道该怎么做 下面是该表的外观: 因此,总而言之,除了VERS_NM列将显示“Actual”之外,第1行将有一个相同的行。至少应该是这样,我想找到任何实际和当前Outlook不匹配的实例。非常感谢您的任何帮助或想法。只要朝着正确的方向推进或者制定某种解决方案

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

我不知道该怎么做

下面是该表的外观:

因此,总而言之,除了VERS_NM列将显示“Actual”之外,第1行将有一个相同的行。至少应该是这样,我想找到任何实际和当前Outlook不匹配的实例。非常感谢您的任何帮助或想法。只要朝着正确的方向推进或者制定某种解决方案就好了


谢谢

您可以按所有其他列对
进行分组,然后使用
having
子句要求每个组有一个“实际”和一个“当前outlook”变量:

选择*
从你的桌子上
分组
可乐
,col2
,       ... 所有其他栏目。。。
具有总和(当VERS_NM=实际值,然后为1结束时的情况)1
或总和(当VERS_NM='当前展望'然后1结束时的情况)1
或计数(*)2

您可以
按所有其他列分组,然后使用
having
子句要求每个组有一个“实际”和一个“当前outlook”变量:

选择*
从你的桌子上
分组
可乐
,col2
,       ... 所有其他栏目。。。
具有总和(当VERS_NM=实际值,然后为1结束时的情况)1
或总和(当VERS_NM='当前展望'然后1结束时的情况)1
或计数(*)2

您可以自行加入数据,将
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
选择
*
从…起
你的桌子是真的吗
内连接
您的表作为outlook
按实际值.a=outlook.a
和实际值.b=outlook.b
和实际值.c=outlook.c
而实际的.d=outlook.d
哪里
实际值。实际值=实际值
和outlook.VERS_NM=‘当前outlook’
和actual.FINC_ACCT_METRIC_VAL outlook.FINC_ACCT_METRIC_VAL

您可以自行加入数据,将
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
选择
*
从…起
你的桌子是真的吗
内连接
您的表作为outlook
按实际值.a=outlook.a
和实际值.b=outlook.b
和实际值.c=outlook.c
而实际的.d=outlook.d
哪里
实际值。实际值=实际值
和outlook.VERS_NM=‘当前outlook’
和actual.FINC_ACCT_METRIC_VAL outlook.FINC_ACCT_METRIC_VAL

另一种方法是使用
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

另一种方法是使用
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

OP需要存在两个匹配行(一个实际行,一个outlook)但值不同的结果。OP需要存在两个匹配行(一个实际行,一个outlook)但值不同的结果。这看起来很有希望。我会让你知道结果的。谢谢工作得很有魅力。再次感谢您的投入!这看起来很有希望。我会让你知道结果的。谢谢工作得很有魅力。再次感谢您的投入!