sql - 如何将相同数据的多列合并为一列?

标签 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 个不同的列。

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

谢谢!

最佳答案

您需要将多列数据逆透视为多行,根据您的 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

关于sql - 如何将相同数据的多列合并为一列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20079076/

相关文章:

c# - 使用 Repeater 和 SQL 自定义分页

sql-server - 如何将参数传递给sql server中的FormsOf函数

sql - 如何限制 NVARCHAR 列上没有空字符串

sql-server - 为什么我收到此错误 `Error (Data mining): Either the user, TEMP-USER\Administrator, does not have permission` ?

sql - HiveQL - 大数据的高效 geoip 发现

java - 如何在java中格式化时隔离括号

android - 如何从两种不同的方法插入数据库

SQL Server 非常乐意添加日期和月份

sql-server - 从 SQL Server 中的同一 xml 列获取多个值

sql - 如何从大型分隔文件在SQL Server中创建多个表并为空间查询设置