簡體   English   中英

將行轉換為列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM