我試圖把原始數據集,增加了列新的數據,並將其轉換爲更傳統的表結構。這個想法是有腳本拉列名(日期),並將它放入一個新列,然後堆疊在彼此的頂部每個日期的數據值。如何調換到行列在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
正確的技術術語是「支點」。搜索那個。這個問題每天會被詢問一次。 –