[英]Transposing a row to columns
我已將這些數據從平面文件源導入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
...
根據進一步的要求,這個答案可能已經過時了,但是鑒於目前的評論,我的建議是不要更改SQL Server中的數據,而只是橫向而不是縱向查看。 像Excel這樣的應用程序更適合於此。 您可以從Management Studio復制和粘貼查詢結果(結果到網格),從源平面文件復制和粘貼,或者將數據作為列獲取到Excel中。 突出顯示200行,單擊“ Copy
,然后右鍵單擊某個位置並選擇“ Paste Special...
您將在此處看到一個對話框,只需選中“ Transpose
復選框,然后單擊“ OK
。 瞧,您的行是列!
對不起,尺寸。 我的視網膜使所有屏幕截圖的大小增加了一倍,除了使用其他計算機之外 , 我還沒有找到一種方便的解決方法 。 :-(
現在,如果您真的想在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個varchar(max)
列來“修復”該問題,但是想到這一點實際上使我不寒而栗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.