如何将同一数据的多个列组合到一个列中?

时间:2013-11-19 18:20:35

标签: sql sql-server

我在这里遇到的问题是数据格式不佳(不是代表我)。我从外部实体下载了一个包含全国数据的大型CSV文件 - 它有大约5,000,000多行,因此要打开的文件太大,更不用说手动操作数据了。我确实将它上传到我们的SQL数据库,但是将数据转换为可用的格式很困难;每行有10个不同的类别代码,每个类别可以有多个代码。不幸的是,他们添加了新列来处理这个而不是添加新行。很难用一个例子来描述:

ID  A_Code1 A_Code2 A_Code3 B_Code1 B_Code2 B_Code3
1   123     765     654     qwe     asd     zxc
2   987     345     567     poi     lkj     mnb

这就是我需要的:

ID  A_Code  B_Code
1   123     qwe
1   765     asd
1   654     zxc
2   987     poi
2   345     lkj
2   567     mnb

现在设置的方式使得查询几乎不可能,因为每行有大约10种不同类型,每种代码类型有10列。这意味着当我只需要查询10时,我必须查询100个不同的列。

如果有人知道如何做到这一点,我们将不胜感激。到目前为止,我还没有找到这样的东西,所以我变得绝望了!

谢谢!

1 个答案:

答案 0 :(得分:2)

您需要将多列数据拆分为多行,具体取决于您的SQL Server版本,有多种方法可以获得结果。

如果使用SQL Server 2005 +:

,则可以使用CROSS APPLYUNION ALL
select id, A_Code, B_Code
from yourtable
cross apply
(
  select A_Code1, B_Code1 union all
  select A_Code2, B_Code2 union all
  select A_Code3, B_Code3
) c (A_Code, B_Code);

请参阅SQL Fiddle with Demo

如果使用SQL Server 2008 +:

,您还可以将CROSS APPLYVALUES一起使用
select id, A_Code, B_Code
from yourtable
cross apply
(
  values
    (A_Code1, B_Code1),
    (A_Code2, B_Code2),
    (A_Code3, B_Code3)
) c (A_Code, B_Code);

请参阅SQL Fiddle with Demo

这允许您将列转换为成对的行 - 这意味着A_Code1B_Code1将在最终结果中匹配。

您还可以使用UNION ALL

select id, A_Code = A_Code1, B_Code = B_Code1
from yourtable 
union all
select id, A_Code = A_Code2, B_Code = B_Code2
from yourtable 
union all
select id, A_Code = A_Code3, B_Code = B_Code3
from yourtable ;

请参阅SQL Fiddle with Demo