我正在尝试使用原始数据集添加新数据列并将其转换为更传统的表结构。我们的想法是让脚本拉出列名(日期)并将其放入一个新列,然后将每个日期数据值叠加在一起。
实施例
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 :(得分: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;
您可以使用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 |
答案 1 :(得分:0)
根据问题的详细信息(即源格式,日期的数量和可变性,执行任务的频率等),使用其他语言解析数据可能要容易得多。执行重新格式化功能或直接插入决赛桌。
如上所述,如果您对完全SQL解决方案感兴趣,听起来您正在寻找一些动态数据透视功能。关键字为dynamic SQL
和unpivot
。详细信息根据您使用的RDBMS以及初始数据集上的规范而有所不同。
答案 2 :(得分:-1)
我会使用脚本语言(Perl,Python等)为原始数据中的每个日期列生成INSERT语句,并将其转换为由Store
和{{1}键控的行}。然后将插入运行到规范化表中。