我有一张表如:
John email1 email2 email3 ...and so on
我需要将数据集转换为这种格式:
John email1
John email2
John email3
如果更容易,它可以导出到Excel并导入。感谢...
答案 0 :(得分:4)
假设Name,Email1,Email2,Email3是列名:
Select Name, Email1
From YourTable
Where Email1 <> ''
Union
Select Name, Email2
From YourTable
Where Email2 <> ''
Union
Select Name, Email3
From YourTable
Where Email3 <> ''
答案 1 :(得分:3)
你是什么意思修复?你可以这样做:
SELECT name+' '+email1 as email1,
name+' '+email2 as email2,
name+' '+email3 as email3,
name+' '+email3 as email3,
...
FROM table
以上是在我看到格式化之前编写的......我相信这就是你想要的 - 只在mssqlserver上测试
declare @t table
(
name varchar(max),
email1 varchar(max),
email2 varchar(max),
email3 varchar(max),
email4 varchar(max)
)
insert into @t
values ('name1a','email1a','email2a','email3a','email4a')
insert into @t
values ('name2b','email1b','email2b','email3b','email4b')
select * from @t
SELECT name, email
FROM
(
SELECT name, email1, email2, email3, email4
FROM @t) p
UNPIVOT
(email FOR emails IN
(email1, email2, email3, email4)
)AS unpvt
答案 2 :(得分:0)
我认为没有理由“走出去”XLS或其他东西,然后重新导入。
您可以通过
解决问题1)(只有在认为值得,取决于数据库大小,行数等)时,可能会在表上删除一些索引。
2)运行INSERT查询以添加新行,即从Name和“Emailn”列(以及其他所需列或所需的默认值)创建的行
3)一旦调度了所有“Emailn”列,就改变表模式以删除这些列。
4)重新构建先前删除的索引和/或重新打包其他索引。
具体来说,对于#2,查询(ies)看起来像
INSERT INTO MyTable
(Name, Email1, SomeOtherColumn, YetOtherColumn)
SELECT Name, Email2, someColumn, "ABC"
FROM MyTable
WHERE Email2 IS NOT NULL
您可以为Email1之外的每个“Emailn”列执行此操作。等瞧...
只有在桌子很大的时候可能会遇到困难,但是因为你在考虑使用Excel,所以情况可能并非如此。
答案 3 :(得分:0)
彻底检修(我的原始答案是基于该问题的短暂错误版本)。
如果“平面文件”指的是文本文件,那么转换的简单(非SQL)版本将使用awk,例如:
awk "{ for (i = 2; i <= NF; i++ ) { print $1, $i }}" < original.txt