2012-02-13 4 views
0

私は非常に簡単なSQLタスクを手にしており、私が思いついた解決策の検証(またはガイダンス)をしたいと思います。助けてくれてありがとう!SQL - 一致するレコード間でデータを複製する

私は(SSISを使用して)ステージング表にフラット・ファイルからユーザー情報をインポートしています:

は、ここで私が直面してる問題(簡体字)です(これは私の最初の投稿です)。各ユーザーには2つまたは3つのレコードがあります。各行には重要なデータが含まれます。

PK | Name | UniqueCustID | Info1 | Info2 | Info3 | 
---------------------- 
1 | John Doe | 12345  | Opt1 | NULL | NULL 
2 | John Doe | 12345  | NULL | Opt2 | NULL 
3 | John Doe | 12345  | NULL | NULL | Opt3 

最終結果のニーズは、このようなものになること:

PK | Name | UniqueCustID | Info1 | Info2 | Info3 | 
---------------------- 
1 | John Doe | 12345  | Opt1 | Opt2 | Opt3 
最終的な結果は、データの一例です。ここ全て3

からの情報が含まれている顧客ごとに1つのレコードをする必要があります

私はこれをできるだけシンプルに保つようにしています。私はSSIS(またはカップル)の基本的なExecute SQLタスクでこれを処理したいと思います。人々の飛び降り反応とは何ですか?追加情報を提供することはできますか?ありがとうございました。

UPDATE - 私がしようとしている2つの段階のプロセス表示するには:

1)この個々の顧客セットマッチのすべてを行う必要があります

WITH CustInfoTMP (UniqueCustID,Info1,Info2,Info3) 
AS 
    (
    SELECT UniqueCustID,MAX(Info1),MAX(Info2),MAX(Info3) 
    FROM CustStaging 
    GROUP BY UniqueCustID 
    ) 
UPDATE CustStaging 
SET 
    CustStaging.Info1 = CustInfoTMP.Info1 
    CustStaging.Info2 = CustInfoTMP.Info2 
    CustStaging.Info3 = CustInfoTMP.Info3 
FROM CustStaging 
INNER JOIN CustStagingTMP ON CustStaging.UniqueCustID = CustStagingTMP.UniqueCustID 

2)私は、これを使用して重複したレコードを削除するには:

DELETE 
FROM CustStaging 
WHERE UniqueCustID NOT IN 
    (
    SELECT MAX(PK) 
    FROM CustStaging 
    GROUP BY UniqueCustID 
    ) 

私は誰もがこれを守っています。私は本当にフィードバックに感謝します。

+0

行2は、 'Info1'列に' Opt4'を持っている場合、あなたが何をしたいですか? –

+0

@AaronBertrand - それは私が考えなかった素晴らしい質問です。今のところ、Info1/info2/info3列の情報は常に同じ顧客のものとみなすことができます。 – JohnnyMatthys

+0

それは答えですか?私は私が従うかどうか分からない。 –

答えて

0

これはいかがですか?

CREATE TABLE TargetTable_tbl 
(ID INT IDENTITY(1,1) , 
    Name varchar(100), 
    Info1 varchar(10), 
    Info2 varchar(10), 
    Info3 varchar(10) 
) 
go 

insert TargetTable_tbl 

select distinct Name, Info1, Info2, Info3 
from StagingTable_tbl ST 
left join 
(select distinct Name, Info1 
    from StagingTable_tbl 
    where Info1 is not null) I1 on ST.Name = I1.Name 
left join 
(select distinct Name, Info2 
    from StagingTable_tbl 
    where Info2 is not null) I2 on ST.Name = I2.Name 
left join 
(select distinct Name, Info3 
    from StagingTable_tbl 
    where Info3 is not null) I3 on ST.Name = I3.Name 
go 
+0

このソリューションはステージングテーブルをそのまま維持し、最終テーブルへの挿入時にそれらを修正します。なぜ私はこれについて考えなかったのか分かりません、私は尋ねたのです!これは私が選択したものよりも私には理にかなっています(挿入前にステージングテーブルを更新しようとしています) – JohnnyMatthys

0

おそらく:

select a.name, a.uniqueCustID, 
a.info1, b.info2, c.info3 
from table1 a 
left outer join table1 b on b.pk = a.pk and b.info1 is not null 
left outer join table1 c on c.pk = a.pk and c.info2 is not null 

左の外側には、ユーザがデータを1、2または3レコードを持つことになります場合は、事前に知っていないので、必要とされて合流します。このようにして、データがない場合、対応するフィールドにnullが挿入されます。

+0

私はこれに似たことを読む。これは基本的にテーブル自体に結合していますが、正しいのでしょうか?当時、私はこの周りに私の頭を包むことができなかったので、私はGoogleが私に言ったものを使用しました!私もこれを試してみる必要があります。ありがとう! – JohnnyMatthys

+0

はい、自己結合と呼ばれています。 – theglauber

3

それはヌルを排除する、MAX関数を使用します。

select min(id), UniqueCustID, name, max (Opt1), max(Opt2), max(Opt3) 
from TABLE 
group by UniqueCustID, name 
+1

"名前"列を忘れました。これを選択列リストに追加してグループ化すると、完了です。 –

+0

@Diego/Philip - これは私がやっていることのようなものです。ありがとうございました。レコードをグループ化したら、私はどのように更新することを提案しますか?レコードをロー・フォーマットでインポートするので、このselect文は更新の結果でなければなりません。 – JohnnyMatthys

関連する問題