2014-01-06 78 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 |