我试图把原始数据集,增加了列新的数据,并将其转换为更传统的表结构。这个想法是有脚本拉列名(日期),并将它放入一个新列,然后堆叠在彼此的顶部每个日期的数据值。如何调换到行列在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
感谢
我试图把原始数据集,增加了列新的数据,并将其转换为更传统的表结构。这个想法是有脚本拉列名(日期),并将它放入一个新列,然后堆叠在彼此的顶部每个日期的数据值。如何调换到行列在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
感谢
我会用一个脚本语言(Perl,Python和等)为您生成有每个日期列的INSERT语句在原始数据并转成由Store
和Date
键入一行。然后将插入运行到您的标准化表格中。
这是没有意义的,为什么使用一个脚本语言,当枢纽可以在SQL中完成? – Hogan
根据问题的细节(例如源格式,日期的数量和可变性,需要多长时间执行一次任务等),使用某种其他语言解析数据可能会更容易并执行重新格式化功能或直接插入到最终表格中。
上面说了,如果你有兴趣在一个完全SQL解决方案,它听起来就像你正在寻找一些动态透视功能。关键字是dynamic SQL
和unpivot
。具体细节取决于您正在使用的RDBMS以及初始数据集上的规格。
有几种不同的方式,你可以得到你想要的结果。
您可以使用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;
可以使用UNPIVOT
功能:
select store, date, value
from yourtable
unpivot
(
value
for date in ([1/1/2013], [2/1/2013])
) un;
最后,根据您的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 |
严格地说,它看起来很简单。如果您可以告诉我们数据如何存储(表格定义)或告诉我们您已经拥有了什么,我们可以告诉您如何到达那里。 – RBarryYoung
尼斯使用技术术语的“熔融” – Hogan
正确的技术术语是“支点”。搜索那个。这个问题每天会被询问一次。 –