如何将列转换为sql server中的行

时间:2014-01-06 18:21:19

标签: sql-server unpivot

我正在尝试使用原始数据集添加新数据列并将其转换为更传统的表结构。我们的想法是让脚本拉出列名(日期)并将其放入一个新列,然后将每个日期数据值叠加在一起。

实施例

Store     1/1/2013     2/1/2013
XYZ INC   $1000        $2000

Store     Date         Value
XYZ INC   1/1/2013     $1000
XYZ INC   2/1/2013     $2000

感谢

3 个答案:

答案 0 :(得分:6)

您可以通过几种不同的方式获得所需的结果。

您可以SELECT使用UNION ALL

select store, '1/1/2013' date, [1/1/2013] value
from yourtable
union all
select store, '2/1/2013' date, [2/1/2013] value
from yourtable;

请参阅SQL Fiddle with Demo

您可以使用UNPIVOT功能:

select store, date, value
from yourtable
unpivot
(
  value
  for date in ([1/1/2013], [2/1/2013])
) un;

SQL Fiddle with Demo

最后,根据您的SQL Server版本,您可以使用CROSS APPLY

select store, date, value
from yourtable
cross apply
(
  values
    ('1/1/2013', [1/1/2013]),
    ('2/1/2013', [2/1/2013])
) c (date, value)

SQL Fiddle with Demo。所有版本都会得到以下结果:

|   STORE |     DATE | VALUE |
|---------|----------|-------|
| XYZ INC | 1/1/2013 |  1000 |
| XYZ INC | 2/1/2013 |  2000 |

答案 1 :(得分:0)

根据问题的详细信息(即源格式,日期的数量和可变性,执行任务的频率等),使用其他语言解析数据可能要容易得多。执行重新格式化功能或直接插入决赛桌。

如上所述,如果您对完全SQL解决方案感兴趣,听起来您正在寻找一些动态数据透视功能。关键字为dynamic SQLunpivot。详细信息根据您使用的RDBMS以及初始数据集上的规范而有所不同。

答案 2 :(得分:-1)

我会使用脚本语言(Perl,Python等)为原始数据中的每个日期列生成INSERT语句,并将其转换为由Store和{{1}键控的行}。然后将插入运行到规范化表中。