【问题标题】:SQL Query Design for data validation issue数据验证问题的 SQL 查询设计
【发布时间】:2012-07-31 13:59:33
【问题描述】:

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

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

表格如下所示:

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

谢谢!

【问题讨论】:

    标签: sql sql-server teradata


    【解决方案1】:

    您可以自行加入数据,将字段 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
    

    【讨论】:

    • 这看起来很有希望。我会让你知道它是如何工作的。谢谢!
    • 工作就像一个魅力。再次感谢您的意见!
    【解决方案2】:

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

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

    COL1COL2 等字段替换为您要比较的列。为了便于比较,我在内部 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
    

    【讨论】:

      【解决方案3】:

      您可以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
      

      【讨论】:

      • OP 想要两个匹配行存在的结果(一个实际,一个前景),但具有不同的值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多