1

財務データを含むファクトテーブルがあります。値が「実際」であるか「現在のOutlook」であるかを定義する列(VERS_NM)があります。これら2つの値は常に同じである必要がありますが、一部のレポートでは正しくないように見えることがわかりました。そこで、実際の値が現在の見通しと一致しない場所を見つけるためのクエリを作成したいと思います。

私はこれを行う方法に頭を包むことができません。

テーブルは次のようになります。 テーブル

したがって、要約すると、VERS_NM列に「実際」と表示されることを除いて、行1と同じ行があります。少なくともそうなるはずですが、実際のOutlookと現在の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で2つのテーブルを比較するための最短、最速、および最も簡単な方法であるUNION!の記事で説明されています。2つの別々のテーブルを比較しますが、1つのテーブルを分析できます。

フィールドなどを比較する列COL1に置き換えます。比較のために、データを2つの別々のテーブルとして効果的に表示するための句を内部にCOL2追加しました。WHERESELECT

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 に答える