2014-01-06 39 views
2

我试图把原始数据集,增加了列新的数据,并将其转换为更传统的表结构。这个想法是有脚本拉列名(日期),并将它放入一个新列,然后堆叠在彼此的顶部每个日期的数据值。如何调换到行列在SQL Server

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 

感谢

+0

严格地说,它看起来很简单。如果您可以告诉我们数据如何存储(表格定义)或告诉我们您已经拥有了什么,我们可以告诉您如何到达那里。 – RBarryYoung

+0

尼斯使用技术术语的“熔融” – Hogan

+1

正确的技术术语是“支点”。搜索那个。这个问题每天会被询问一次。 –

回答

-1

我会用一个脚本语言(Perl,Python和等)为您生成有每个日期列的INSERT语句在原始数据并转成由StoreDate键入一行。然后将插入运行到您的标准化表格中。

+0

这是没有意义的,为什么使用一个脚本语言,当枢纽可以在SQL中完成? – Hogan

0

根据问题的细节(例如源格式,日期的数量和可变性,需要多长时间执行一次任务等),使用某种其他语言解析数据可能会更容易并执行重新格式化功能或直接插入到最终表格中。

上面说了,如果你有兴趣在一个完全SQL解决方案,它听起来就像你正在寻找一些动态透视功能。关键字是dynamic SQLunpivot。具体细节取决于您正在使用的RDBMS以及初始数据集上的规格。

+0

非常罕见的是,一个枢纽或不支点需要是动态的,没有任何建议需要动态解决问题。 – Hogan

+0

@霍根,你是对的,这个问题中提供的细节很少。不过,我完全不同意你的评估,即枢轴/不透明是很有活力的。虽然在这里可能不需要,但有一个非常明显的迹象表明,未经转换的列经常发生变化。所以,除非你喜欢不断重新访问你编写的代码,否则一个小小的动态SQL可以很好地解决这个问题。 – chezy525

5

有几种不同的方式,你可以得到你想要的结果。

您可以使用SELECTUNION 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 |