2012-02-13 15 views
0

我有一个相当简单的SQL任务,我想为我提出的解决方案进行验证(或指导)。感谢您的帮助! (这是我的第一篇文章)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任务来处理这个问题。什么是人们的跳跃反应?我可以提供任何其他信息吗?再次感谢你。

UPDATE - 要显示的两步过程我想:

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行有'Opt4'在'Info1'列? – 2012-02-13 16:10:12

+0

@AaronBertrand - 这是一个很好的问题,我没有想过。现在,我们可以假设Info1/info2/info3列中的信息对于相同的客户始终是相同的。 – JohnnyMatthys 2012-02-13 17:09:20

+0

这是个答案吗?我不确定我是否遵守。 – 2012-02-13 17:09:52

回答

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 2012-02-13 17:55:40

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

+0

我读到类似这样的东西。这基本上是加入一张桌子,对吗?当时我无法把头绕在这里,所以我用谷歌告诉我的!我也必须尝试一下。谢谢! – JohnnyMatthys 2012-02-13 17:51:58

+0

是的,它被称为自连接。 – theglauber 2012-02-13 22:24:20

3

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

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

您忘记了“名称”列。将它添加到选择列列表并按组分组,然后就完成了。 – 2012-02-13 16:13:31

+0

@Diego/Philip - 这就是我正在做的事情。谢谢。一旦我将这些记录分组后,您会如何建议我更新?我以原始格式导入记录,所以这个select语句应该是更新的结果。 – JohnnyMatthys 2012-02-13 17:47:42

相关问题