T SQL - 拆分和合并列

时间:2010-09-01 09:45:50

标签: sql tsql

我遇到过一个我以前没见过的问题。我有一个Excel数据源,我已经加载到SQL表中,我试图转换成更合理的东西。我得到的是来自Excel的SQL表中的A列,其中包含所有3个数据字段,但我需要添加列来替换所有者和舞台的组

注意用户可以有多个阶段,一个阶段可以有很多项目。项目名称是唯一的。

例如

我从Excel导入的源表有1列

[ColumnA]
Owner: David Jones 
  Stage1: Suspect 
Project A  
Project B 
 Stage2:Qualified Suspect
Project C 
Project D  
Owner: John Doe
  Stage1:Suspect
Project E 
  Stage2:Qualified Suspect
Project F 
Project G 

然后我希望我的目标行看起来像

[owner]        [stage]                      [project]
David Jones    Stage1:Suspect               ProjectA
David Jones    Stage1:Suspect               ProjectB
David Jones    Stage2:Qualified Suspect     ProjectC
David Jones    Stage1:Qualified Suspect     ProjectD
John Doe       Stage1:Suspect               ProjectE
John Doe       Stage1:Qualified Suspect     ProjectF
John Doe       Stage1:Qualified Suspect     ProjectG

提前致谢

3 个答案:

答案 0 :(得分:3)

Table_1是您将Excel导入的SQL表。

    select * from Table_1
declare @temp varchar(50)
declare @owner varchar(50)
declare @stage varchar(50)
Declare My_Cursor cursor 
For
Select ColumnA
from Table_1

Open My_Cursor
Fetch Next from My_Cursor into @temp
while(@@Fetch_Status=0)
begin
if @temp like 'Owner%'
set @owner = @temp
if @temp like 'Stage%'
set @stage=@temp
if @temp like 'Project%'
begin
select LTRIm(SUBSTRing(@owner,7,LEN(@owner))),@stage,@temp
end
Fetch NExt from My_Cursor into @temp
end
close My_Cursor
deallocate My_Cursor

输出:

    ColumnA
--------------------------------------------------
Owner: David Jones
Stage1: Suspect
Project A
Project B
Stage2: Qualified Suspect
Project C
Project D
Owner: John Doe
Stage1: Suspect
Project E
Stage2: Qualified Suspect
Project F
Project G

(13 row(s) affected)


-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
David Jones                                        Stage1: Suspect                                    Project A

(1 row(s) affected)


-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
David Jones                                        Stage1: Suspect                                    Project B

(1 row(s) affected)


-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
David Jones                                        Stage2: Qualified Suspect                          Project C

(1 row(s) affected)


-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
David Jones                                        Stage2: Qualified Suspect                          Project D

(1 row(s) affected)


-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
John Doe                                           Stage1: Suspect                                    Project E

(1 row(s) affected)


-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
John Doe                                           Stage2: Qualified Suspect                          Project F

(1 row(s) affected)


-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
John Doe                                           Stage2: Qualified Suspect                          Project G

(1 row(s) affected)

将select语句替换为表中的insert。如果有效,请告诉我。

答案 1 :(得分:1)

假设您的单列已在数据库表中可用,我可以建议您编写动态sql(存储过程)。创建一个包含3列(所有者,阶段,项目)的新表格,说FinalResult。

然后,您可以使用游标从excel数据表中获取每一行,并根据您的逻辑将结果插入到新的FinalResult表中。

最后,您可以从新表中检索这些结果,以获得所需的结果。

答案 2 :(得分:1)

如果我已正确理解,项目的所有者和阶段由项目行之前读入的最后所有者和阶段记录确定。

这会产生问题 - 在大多数关系数据库(包括SQLServer)中,您无法保证查询的输出顺序与行输入表中的顺序相匹配。换句话说,仅仅通过查询[ColumnA],有没有方式来告诉项目A属于David Jones和Stage1:可疑,而不是(例如)John Doe和Stage2:合格的嫌疑人。

如果还没有(至少)在数据库源表中保存Excel行号的列,则应添加此类列并重新加载表。

我认为修改Excel电子表格以获取所有者,阶段和项目列以及从修改后的电子表格加载表格会更简单。