2013-03-09 70 views
0

我已經將這些數據從平面文件源導入到SQL Server中。將行轉換爲列

B 01 1007282 Y 1001201 15102 
B 02 LEVEL  Y 2705201 15102 
B 03 1998014 Y 2808201 15102 
B 05   Y 2808201 15102 
B 06 49081100 Y 1708201 15102 
B 07 64072151 Y 2903201 15102 
B 08 75090350 Y 0111200 15102 
B 09 58082950 Y 0608200 15102 
B 10 75112551 Y 1007200 15102 
B 11 72030950 Y 1007200 15102 
B 20 74507632 Y 2808201 15102 
B 23 98240166 Y 2808201 15102 
B 25 U4507632 Y 2808201 15102 
B 26 45002267 Y 2808201 15102 

從這個數據我需要每行和每一個分成不同的列:

Column 1 : B 01 1007282 Y 1001201 15102 
Column 2 : B 02 LEVEL  Y 2705201 15102 
... 
+1

你可以顯示當前表結構的位置,你將它導入?它真的只是一列嗎?有沒有已知的行數?如果有5000行,你希望將它轉換成5000列的表格嗎?爲什麼? – 2013-03-09 16:53:12

+0

有200行,如果可能的話,我需要放入列中,請讓我知道 – user2151321 2013-03-09 16:58:51

+1

200列是相當多的。那麼你將如何處理數據呢?瞭解目的將幫助我們給你更好的答案。是的,我們可以告訴你如何做你正在做的事情,但這聽起來不是一個好主意,想象你將如何使用它是非常困難的。 – 2013-03-09 16:59:54

回答

1

這個答案可能取決於進一步的要求變得過時,但迄今爲止給出的意見,我建議不要在SQL Server中更改數據,而只是縱向而不是縱向查看它。 Excel等應用程序更適合於此。您可以從Management Studio複製和粘貼查詢結果(結果到網格),從源平面文件中複製和粘貼,或以其他方式將數據作爲列獲取到Excel中。突出顯示200行,點擊Copy,然後右鍵單擊某處並選擇Paste Special...,您將在此處看到對話框,只需選中Transpose複選框並點擊OK即可。瞧,你的行是列!

enter image description here

enter image description here

很抱歉的大小。我的視網膜是所有屏幕截圖的兩倍,I haven't found a convenient workaround yet, other than using a different computer。 :-(


現在,如果你真的想這樣做在SQL Server中,你可以我想做些什麼醜陋這樣考慮下面的源表(假設SQL Server 2008或更好)。

CREATE TABLE dbo.InColumns(col VARCHAR(255)); 
GO 

INSERT dbo.InColumns(col) VALUES 
('B 01 1007282 Y 1001201 15102'), 
('B 02 LEVEL  Y 2705201 15102'), 
('B 03 1998014 Y 2808201 15102'), 
('B 05   Y 2808201 15102'), 
('B 06 49081100 Y 1708201 15102'), 
('B 07 64072151 Y 2903201 15102'), 
('B 08 75090350 Y 0111200 15102'), 
('B 09 58082950 Y 0608200 15102'), 
('B 10 75112551 Y 1007200 15102'), 
('B 11 72030950 Y 1007200 15102'), 
('B 20 74507632 Y 2808201 15102'), 
('B 23 98240166 Y 2808201 15102'), 
('B 25 U4507632 Y 2808201 15102'), 
('B 26 45002267 Y 2808201 15102'); 

現在一些哦,這麼好玩的動態SQL:

DECLARE @sql NVARCHAR(MAX) = N'', @maxlen INT; 

SELECT @maxlen = MAX(LEN(col)) FROM dbo.InColumns; 

SELECT @sql += N', 
    Col' + RTRIM(rn) + ' VARCHAR(' + RTRIM(@maxlen) + ')' 
FROM (SELECT rn = ROW_NUMBER() OVER 
    (ORDER BY col) FROM dbo.InColumns) AS x; 

SET @sql = N'CREATE TABLE dbo.InRows 
(' + STUFF(@sql, 1, 1, N'') + ');'; 

EXEC sp_executesql @sql; 

SET @sql = N''; 

SELECT @sql += N', 
    (SELECT col FROM x WHERE rn = ' + RTRIM(rn) + ')' 
    FROM (SELECT rn = ROW_NUMBER() 
    OVER (ORDER BY col) FROM dbo.InColumns) AS x; 

SET @sql = N';WITH x AS (SELECT col, rn = ROW_NUMBER() OVER 
    (ORDER BY col) FROM dbo.InColumns) 
INSERT dbo.InRows SELECT TOP (1) ' 
    + STUFF(@sql, 1, 1, N'') + ' FROM x;'; 

EXEC sp_executesql @sql; 
GO 
SELECT * FROM dbo.InRows; 
GO 
DROP TABLE dbo.InRows; 

結果:

Col1        Col2 ... 
--------------------------------- ------------------------- 
B 01 1007282 Y 1001201 15102 B 02 LEVEL  Y 27... 

瞭解爲什麼這在Excel中更容易?

使用200行,您將會危險地接近超過表格的最大行大小。你可以通過製作這些200列的「修復」,但這種想法實際上讓我感到不寒而慄。

+0

令人驚訝的是,你會回答這個問題亞倫 - 在我看來,OP實際上並不想這樣做(因爲我無法想象爲什麼)。 – Hogan 2013-03-10 00:49:57