SQL - 跨匹配记录复制数据

时间:2012-02-13 16:00:15

标签: sql sql-server-2008

我手头有一个相当简单的SQL任务,我想为我提出的解决方案进行验证(或指导)。谢谢你的帮忙! (这是我的第一篇文章)

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

我正在将平面文件中的用户信息导入临时表(使用SSIS)。每个用户将有2或3条记录。每行包含重要数据。最终结果需要是每个客户1条记录,其中包含来自所有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
    )

我希望每个人都遵循这一点。我非常感谢您的反馈。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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。

答案 2 :(得分: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