SQL-跨匹配记录复制数据

SQL-跨匹配记录复制数据,sql,sql-server-2008,Sql,Sql Server 2008,我手头有一个相当简单的SQL任务,我希望对我提出的解决方案进行验证(或指导)。谢谢你的帮助!(这是我的第一篇帖子) 以下是我面临的问题(简化): 我正在将用户信息从平面文件导入临时表(使用SSI)。每个用户将有2或3条记录。每行将包含重要数据。最终结果需要每个客户有一条记录,其中包含所有3条记录的信息 下面是一个数据示例: PK | Name | UniqueCustID | Info1 | Info2 | Info3 | ---------------------- 1 | J

我手头有一个相当简单的SQL任务,我希望对我提出的解决方案进行验证(或指导)。谢谢你的帮助!(这是我的第一篇帖子)

以下是我面临的问题(简化):

我正在将用户信息从平面文件导入临时表(使用SSI)。每个用户将有2或3条记录。每行将包含重要数据。最终结果需要每个客户有一条记录,其中包含所有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
我尽量让这件事尽可能简单。我想用SSIS中的一个基本执行SQL任务(或几个)来处理这个问题。人们的反应是什么?我能提供更多的信息吗?再次感谢你

更新-要显示我正在尝试的两步流程:

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
    )
我希望每个人都关注这一点。我非常感谢您的反馈。

也许:

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条包含数据的记录。这样,如果没有数据,将在相应字段中插入空值。

可能:

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条包含数据的记录。这样,如果没有数据,将在相应的字段中插入空值。

如何

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  
这个怎么样

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  

使用max函数,它将消除空值:

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

使用max函数,它将消除空值:

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


如果第2行在
Info1
列中有
Opt4
,您想要什么?@AaronBertrand-这是一个很好的问题,我还没有考虑过。现在,我们可以假设Info1/info2/info3列中的信息对于相同的客户总是相同的。这是答案吗?我不确定我是否遵守了。@RedFilter-我可能必须更新我的原始帖子以向您展示我在做什么。我使用WITH子句创建一个临时表(我认为它被称为CTE),然后更新临时表,使每组客户记录匹配。然后我删除了重复的。对不起,亚伦。我想我在结束评论之前按了回车键。希望我现在回答了你的问题。如果第2行在
Info1
列中有
Opt4
,你想要什么?@AaronBertrand-这是一个很好的问题,我没有考虑过。现在,我们可以假设Info1/info2/info3列中的信息对于相同的客户总是相同的。这是答案吗?我不确定我是否遵守了。@RedFilter-我可能必须更新我的原始帖子以向您展示我在做什么。我使用WITH子句创建一个临时表(我认为它被称为CTE),然后更新临时表,使每组客户记录匹配。然后我删除了重复的。对不起,亚伦。我想我在结束评论之前按了回车键。希望我现在回答了你的问题。你忘了“姓名”栏。将它添加到“选择列”列表和“分组依据”中,就完成了。@Diego/Philip-这就是我正在做的事情。非常感谢。一旦我将记录分组,您会建议我如何更新?我以原始格式导入记录,因此此select语句应该是更新的结果。您忘记了“名称”列。将它添加到“选择列”列表和“分组依据”中,就完成了。@Diego/Philip-这就是我正在做的事情。非常感谢。一旦我将记录分组,您会建议我如何更新?我以原始格式导入记录,所以这个select语句应该是更新的结果。这基本上是将一个表连接到它自己,对吗?当时我还不能完全理解这一点,所以我用了谷歌告诉我的!我还得试试这个。谢谢是的,这叫做自连接。我读过类似的东西。这基本上是将一个表连接到它自己,对吗?当时我还不能完全理解这一点,所以我用了谷歌告诉我的!我还得试试这个。谢谢是的,它被称为自联接。因此,此解决方案将保持暂存表的原样,然后在插入到最终表时更正它们。我不知道为什么我没有想到这一点,哈哈(我想这就是我问的原因!)。这比我选择的更有逻辑意义(我正在尝试在插入之前更新暂存表),因此此解决方案将保持暂存表不变,然后在插入到最终表时更正它们。我不知道为什么我没有想到这一点,哈哈(我想这就是我问的原因!)。这比我选择的更有逻辑意义(我正在尝试在插入之前更新暂存表)