2016-04-05 5 views
0

IDに基づいて、一致しないレコードをチェックする必要がある約15のテーブルがあります。ですから、例えば、私は連絡先情報を一つのテーブルを持っている:SQLのレコードを動的に比較する

TransID FirstName LastName Phone   Extn 
80071 Michael  Kriegel  888-555-6265 1111 
80071 Pam   Morrow  888-555-9999 2222 
80071 Barbara  Smith  888-555-7770 3333 
80071 Yessika  Zurita  888-555-6622 4444 
80072 Pam   Morrow  888-555-9999 2222 
80072 Barbara  Smith  888-555-7777 3333 
80072 Yessika  Zurita  888-555-9954 4444 
80072 Michael  Kriegel  888-555-6265 1122 

私たちは、そのEXTN 2 TransIDsの間で異なっているマイケル・Kriegelを持っている、と我々はバーバラ・スミスとその電話番号が異なっているZurita Yesskiaを持っています。

私がする必要があるのは、どのレコードが異なっているかを示し、どのフィールドが異なるかを示す方法です。しかし、私は15種類の比較をハードコーディングしたくないので、一般的なので、これを書く必要もあります。

私は私の出力はこのように見えるように取得したいのですが:

Name     Field   TransID_80071 TransID_80072 
Michael Kriegel  Extn   1111   1122 
Barbara Smith   Phone   888-555-7770 888-555-7777 
Zurita Yessika  Phone   888-555-6622 888-555-9954 

私はアンピボットいじりんだけど、私はそこに着くことができません。私はこのコードを持っている:だから、私は右のレコードを引っ張ってる

TransID Value   FieldName 
80071 FirstName  Barbara 
80071 LastName  Smith 
80071 Phone   888-555-7770 
80071 Extn   3333 
80072 FirstName  Barbara 
80072 LastName  Smith 
80072 Phone   888-555-7777 
80072 Extn   3333 
80071 FirstName  Michael 
80071 LastName  Kriegel 
80071 Phone   888-555-6265 
80071 Extn   1111 
80072 FirstName  Michael 
80072 LastName  Kriegel 
80072 Phone   888-555-6265 
80072 Extn   1122 
80071 FirstName  Yessika 
80071 LastName  Zurita 
80071 Phone   888-555-6622 
80071 Extn   4444 
80072 FirstName  Yessika 
80072 LastName  Zurita 
80072 Phone   888-555-9954 
80072 Extn   4444 

が、私はにそれを取得する方法を見つけ出すことはできません。

SELECT TransID , Value , FieldName 
FROM 
    (SELECT Max(TransID) as TransID, Convert(VarChar(250),FirstName) as FirstName, 
     Convert(VarChar(250),LastName) as LastName, 
     Convert(VarChar(250),Phone) as Phone, Convert(VarChar(250),CoExtn) as CoExtn 
    FROM tblSQLContacts 
    WHERE TransID IN ('80071', '80072') 
    GROUP BY FirstName, LastName, Phone, CoExtn 
    HAVING count(*) < 2 
    ) p 
UNPIVOT 
    (FieldName FOR Value IN 
     (FirstName, LastName, Phone, CoExtn) 
)AS unpvt 

は、これは私の結果を与えます誰かが私をフィニッシュラインに乗せることができますか?

+0

first_nameとlast_nameも変更できますか? –

+0

それは問題の一部です。 ** **フィールドは変更可能です。理論的には、姓や名字が変更されても、私はそれらを現実的に比較することはできません。議論のために、決して変わらないと言いましょう。しかし、テーブルあたり約40個程度のフィールドがあることを覚えておいてください。上に投稿したものは単なるデータのスニペットです。 –

+0

これらの2つのTransIDにのみ興味がありますか? –

答えて

1

あなたは、このようなデータを持っている場合...

CREATE TABLE #tSQLContacts 
    ([TransID] int, [FirstName] varchar(250), [LastName] varchar(250), [Phone] varchar(250), [Extn] varchar(250)) 
; 

INSERT INTO #tSQLContacts 
    ([TransID], [FirstName], [LastName], [Phone], [Extn]) 
VALUES 
    (80071, 'Michael', 'Kriegel', '888-555-6265', '1111'), 
    (80071, 'Pam', 'Morrow', '888-555-9999', '2222'), 
    (80071, 'Barbara', 'Smith', '888-555-7770', '3333'), 
    (80071, 'Yessika', 'Zurita', '888-555-6622', '4444'), 
    (80072, 'Pam', 'Morrow', '888-555-9999', '2222'), 
    (80072, 'Barbara', 'Smith', '888-555-7777', '3333'), 
    (80072, 'Yessika', 'Zurita', '888-555-9954', '4444'), 
    (80072, 'Michael', 'Kriegel', '888-555-6265', '1122') 
; 

あなたは、このようなあなたの望ましい結果を得ることができます。

;WITH cte AS (
    SELECT *, 
      DENSE_RANK() OVER (PARTITION BY Rnk1, ColumnName ORDER BY ColumnValue) Rnk2 
    FROM (
     SELECT *, 
       DENSE_RANK() OVER (ORDER BY [FirstName], [LastName]) Rnk1 
     FROM #tSQLContacts 
     WHERE TransID IN ('80071', '80072') 
    ) t 
    UNPIVOT 
    (
     ColumnValue 
     FOR ColumnName IN ([Phone], [Extn]) 
    ) up 
) 
SELECT CONCAT(FirstName, ' ',LastName) AS NAME, 
      ColumnName AS Field, 
      [80071] AS [TransID_80071], 
      [80072] AS [TransID_80072] 
FROM (
    SELECT FirstName, 
      LastName, 
      ColumnName, 
      ColumnValue, 
      TransID 
    FROM cte t1 
    WHERE EXISTS (SELECT * 
        FROM cte t2 
        WHERE t1.Rnk1 = t2.Rnk1 
          AND t1.ColumnName = t2.ColumnName 
          AND t2.Rnk2 > 1) 
) t 
PIVOT 
(
    MAX(ColumnValue) 
    FOR TransID IN ([80071], [80072]) 
) p 

これはおそらく動的に実行される可能性がありますが、私たちには十分な情報があるかどうかはわかりません。

+0

聖なるクリスマスツリー!私は実際のデータで動作させるために多くのカスタマイズをしていますが、これは私が求めたものを正確に示してくれます。しかし、1つの質問。 UNPIVOT部分には、正確なフィールド名を入力する必要があるようです。 40個のフィールドを持つテーブルでこれを実行していて、どのフィールド(もしあれば)に異なるデータが入っているのかわからないので、そこにすべてのフィールド名を入れますか?それとも、** FirstName、LastName、TransID以外のすべてのフィールド名**ですか? –

+0

ここでは、すべてのフィールド名が動的に設定された文字列をsys.columnsに問い合わせてクエリを実行します。 –

+0

これらのフィールドを除くすべてのフィールド。どのフィールドが識別子で、これらのフィールドは含まないかを判断する必要があります。 – JamieD77

関連する問題