Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在新表SQL SERVER 2008中将SQL列转换为单独的行_Sql_Sql Server_Database Table - Fatal编程技术网

在新表SQL SERVER 2008中将SQL列转换为单独的行

在新表SQL SERVER 2008中将SQL列转换为单独的行,sql,sql-server,database-table,Sql,Sql Server,Database Table,我有一个表,其中有一组列,如下所示: ID、Name1、Name2、Name3、Title1、Title2、Title3、Email1、Email2、Email3 joe blow,Jane doe,john doe,总裁,秘书,看门人,no@no.com, yes@no.com,maybe@no.com 我正在尝试拆分为多行,并使用以下列标题插入到新表中: ID、姓名、标题、电子邮件 *1-joe blow,总统,no@no.com 1-Jane doe,秘书,yes@no.com 1-约翰·

我有一个表,其中有一组列,如下所示:

ID、Name1、Name2、Name3、Title1、Title2、Title3、Email1、Email2、Email3

joe blow,Jane doe,john doe,总裁,秘书,看门人,no@no.com, yes@no.com,maybe@no.com

我正在尝试拆分为多行,并使用以下列标题插入到新表中:

ID、姓名、标题、电子邮件

*1-joe blow,总统,no@no.com

1-Jane doe,秘书,yes@no.com

1-约翰·多伊,看门人,maybe@no.com*

我在网上找不到任何能帮我解决这个问题的信息。仅此表中就有超过4K的条目,因此不可能手动输入


每个公司的ID必须相同。意思是所有一行都是一个ID,下一行是另一个ID,等等。

工会有什么问题吗

select ID, Name1, Title1, Email1
from table
union all
select ID, Name2, Title2, Email2
from table
union all
select ID, Name3, Title3, Email3
from table

是否始终填充所有列?您可以使用where子句确保填充了name3(其中name3不为null),以确保填充了新表中的所有值。

您没有指定正在使用的SQL Server版本,但将多列转换为多行的过程称为UNPIVOT。有几种方法可以在SQL Server中取消填充数据

如果您使用的是SQL Server 2008+,则可以使用带VALUES子句的交叉应用来取消对3组中的列的填充:

select id, name, title, email
from yourtable
cross apply
(
  values
    (name1, title1, email1),
    (name2, title2, email2),
    (name3, title3, email3)
) c (name, title, email);

如果您使用的是SQL Server 2005+,则可以对UNION ALL使用交叉应用:

select id, name, title, email
from yourtable
cross apply
(
  select name1, title1, email1 union all
  select name2, title2, email2 union all
  select name3, title3, email3
) c (name, title, email);

请参见

请通过添加适当的标记(Oracle、SQL Server、MySQL等)来指定您的目标RDBMS。可能有一些答案利用了并非普遍支持的语言或产品功能。此外,通过使用特定的RDBMS标记它,您的问题可能会得到更适合回答它的人的注意。这与C#SQL SERVER有什么关系?我拿出了C#Jeroen,我在这个项目中使用它是为了其他目的。抱歉搞混了。我已经编辑了你的标题。请参阅“”,其中共识是“不,他们不应该”。除了3次表扫描和UNION导致的排序/合并之外?不,并非所有列都会填充。在我试图修复一个先前存在的设计缺陷时,我还希望将它们放在一个新表中。在这些union语句中,可以有一系列where子句来格式化或过滤坏数据。如果您使用的是sql server 2008+,我会使用BlueFoots提供的解决方案……否则,我会使用这个联盟@Panagiotis-是的,效率不高。一个表中有4k行,3次表扫描也不错。